我与Hibernate和OneToMany Relationship合作时,今天遇到了奇怪的行为,尽管我是故意这样做的,但我并不期望这种行为

College.java

@Entity
@Table(name="COLLEGE")
public class College implements Serializable{
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="COLLEGE_XID")
    private Long collegeId;

    @Column(name="COLLEGE_NAME")
    private String collegeName;

    @OneToMany(mappedBy="college",cascade = CascadeType.ALL)
    private List<Student> studentList = new ArrayList<Student>();
    //... with get and setters
}


学生.java

@Entity
@Table(name = "STUDENT")
public class Student implements Serializable    {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="STUDENT_XID")
    private Long studentId;

    @Column(name="STUDENT_NAME")
    private String studentName;

    @ManyToOne
    @JoinColumn(name="COLLEGE_XID",nullable=false)
    private College college;
    //... with get and setters
}


应用程序

    College college1 = new BdCollege();
    college1.setCollegeName("C_1");

    College college2 = new BdCollege();
    college2.setCollegeName("C_2");

    Student student1 = new BdStudent();
    student1.setStudentName("S_1_C_2");

    CollegeDAO collegeDAO = new  CollegeDAO();

    // setting student 1 Parent to College 1
    student1.setCollege(college1);   // <---- Here the Issue  ... student 1 as college 1 child

    // BUT assigning Student 1 as Child of Collge 2 in List
    // i did it purposely to test the behaviour
    college2.getStudentList().add(student1);  // <---- Here the Issue ... but assigning it in the list of College 2 ... ws expecting Exception

     // Saved College 1 & 2
     collegeDAO.save(college1);
     collegeDAO.save(college2);

      // Saved Successfully BUT


结果
 学院桌

 COLLEGE_XID     COLLEGE_NAME
 --------------  ---------------
 1               C_1
 2               C_2


学生表

 STUDENT_XID     STUDENT_NAME     COLLEGE_XID
 --------------  ---------------  --------------
 1               S_1_C_2          1


我期待一些例外,因为孩子和父母的作业在大学中不匹配-学生示例
 让我困扰的另一件事是休眠生成的查询

Hibernate: insert into COLLEGE (COLLEGE_NAME) values (?)
Hibernate: insert into COLLEGE (COLLEGE_NAME) values (?)
Hibernate: insert into STUDENT (COLLEGE_XID, STUDENT_NAME) values (?, ?)


即它首先保存College 1,然后保存College 2,然后将学生保存为College 2的孩子,但结果显示为College 1的孩子

最佳答案

这是因为您添加了mappingBy属性并使学生成为协会的所有者。
由于学生实体是所有者,因此它将保持关系,并且休眠状态将忽略学院方面的更改。

09-27 19:09