Hibernate在没有主键的表中提取问题

时间:2014-01-08 07:02:40

标签: java sql hibernate

我有一个没有主键的映射表。它只有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;
    }

    }

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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