我有三个实体学生,课程和学生课程。 StudentCourse实体在学生和课程之间保持关联,并在创建该关联时设置startDate。当关联不再有效时,行中的结束日期将更新。我以这种方式保持协会以保存历史。后端也进行了检查,以确保一次学生一次只能选择一门具有活跃关联的课程,即“结束日期”为NULL。

在学生实体中,我想在Hibernate中使用带有Where子句的一对一映射,以便不仅根据StudentId以及指定的where条件来获取StudentCourse表中的匹配行。

但是,当我尝试让StudentCourse Hibernate抛出一个异常时,指出


org.hibernate.HibernateException与给定的一行以上
找到标识符


@Entity
public class Student {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;

    @OneToOne(mappedBy = "student", fetch = FetchType.LAZY)
    @Where(clause = "endDate IS NULL")
    private StudentCourse studentCourse;

    private String name;
}


课程实体:

 @Entity
    public class Course {
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private long id;

        private String name;
    }


学生课程实体:

@Entity
    public class StudentCourses {
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private long id;

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name="studentId", referencedColumnName="id")
        private Student student;

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name="courseId", referencedColumnName="id")
        private Course course;

        @Temporal(TemporalType.TIMESTAMP)
        private Date endDate;

        @Temporal(TemporalType.TIMESTAMP)
        private Date startDate;
    }


我还检查了StudentCourse中有两个具有相同StudentId的条目,但其中一个具有EndDate。所以我只在寻找没有endDate设置的那个。

有什么解决办法吗?

最佳答案

我认为这不会奏效。您可以在休眠的Where中检查有关CollectionBinder注释的注释,该注释指出应与OneToMayManyToMany字段注释一起使用。

您可以在类StudentCourse下将where子句添加到您的实体定义中。在这种情况下,您总是会得到endDate不同于null的实体。我还认为您可能会在业务逻辑中犯错。如果您声明Student应该只有一个StudentCourse,则不应像您那样保留许多实体。或者,当您在数据库中将某些行标记为非活动并且不应该在逻辑中正常使用时,您可能想要实现的功能就是所谓的“软删除”。

因此,使用studentCourse作为集合

@OneToMany
@Where(clause = "endDate IS NULL")
private Collection<StudentCourse> studentCourse;


或使用实体的注释

@Where(clause = "endDate IS NULL")
class StudentCourse {
...
}

关于java - 使用Where子句 hibernate 一对一映射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56891599/

10-10 19:05