【问题标题】:Hibernate fetching issue in table which has no primary key没有主键的表中的休眠获取问题
【发布时间】:2014-01-08 07:02:40
【问题描述】:

我有一个没有主键的映射表。它只有 2 列,例如 student_id 和 test_id 每个学生都有多个测试

student_id  test_id
1001        21
1001        52
1001        35
1001        29
1001        12

当我写查询时

select test_id from test_map where student_id =1001

它获取正确的记录,但是当我通过休眠条件获取时,它显示 5 个值,其中 test_id 仅为 21

在我的pojo中 我尝试使用 student_id 作为@ID,并且在那个 pojo 中没有@ID

Criteria criteria = session.createCriteria(StudentTestMapping.class);
        criteria.add(Restrictions.eq("studentId", studentId));

        List<StudentTestMapping> screenList=criteria.list();
        Iterator<StudentTestMapping> testItr = screenList.iterator();
        while (testItr.hasNext()) {
            StudentTestMapping studentTestMap = (StudentTestMapping) testItr.next();
            Long testId = studentTestMap.getTestId();
            System.out.println("testId : " + testId);
        }



StudentTestMapping.java

    @Entity
    @Table(name = "test_map")
    class StudentTestMapping{

     Long studentId;
     Long testId;


    @ID
    @Column(name = "student_id")
    public Integer getStudentId()
    {
        return this.studentId;
    }

    public void setStudentId(Integer studentId)
    {
        this.studentId = studentId;
    }

    @Column(name = "test_id")
    public String getTestId()
    {
        return this.testId;
    }

    public void setTestId(String testId)
    {
        this.testId = testId;
    }

    }

【问题讨论】:

  • 您能否在此处提供更多信息,例如您的标准代码和映射
  • ID 应该唯一标识表中的一行。如果没有您实体的代码、您正在执行的代码、示例输入和示例输出,我们将无能为力。
  • 我已经更新了代码
  • 您的映射没有意义:studentId 不能唯一标识您的表中的一行。您需要添加一个真实 ID 列,或者使用复合 ID。

标签: java sql hibernate


【解决方案1】:

1) 确保你的 pojo 实现了 Serializable。

2) 您可以将 studentId 注释为 NaturalId。

@NaturalId
@Column(name = "student_id")
public Integer getStudentId()
{
    return this.studentId;
}

您可以通过以下方式访问它:

session.bySimpleNaturalId(StudentTestMapping.class)
   .load(studentId)

3) 您的实体必须有一个 id。您可以添加一个自动递增的标识列,或者如上所述,您可以创建一个包含所有列的复合键。 Basic O/R Mapping

【讨论】:

    猜你喜欢
    • 2012-01-25
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多