java - OneToMany Hibernate 保存级联问题

标签 java mysql database hibernate hibernate-onetomany

我正在使用 Hibernate 和 OneToMany 关系,今天我遇到了一个奇怪的行为,虽然我是故意这样做的,但我没想到会出现这种行为

学院.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
}

应用程序.java

    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   

我期待一些异常(exception),因为大学里 child 和家长的作业不匹配 - 学生示例 另一件让我困惑的事情是 hibernate 生成的查询

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

即,它首先保存大学 1,然后保存大学 2,然后将学生保存为大学 2 的子级,但在结果中它显示为大学 1 的子级

最佳答案

这是因为您添加了mappedBy属性并使学生成为关联的所有者。 由于学生实体是所有者,因此它将维护这种关系,并且 hibernate 将忽略大学方面的更改。

关于java - OneToMany Hibernate 保存级联问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24771253/

相关文章:

mysql - 在字段中用逗号选择?

php - 编辑数据库中的所有条目[php]

java - 没有 instanceof 的类型安全委托(delegate)

java - list.add 上的 NullPointerException

php - 使用 PHP 和 MySQL 隐藏包含特定字符串的行

php - 如何在 INSERT 之前获取 mysql 行的 ID

PHP mySQL preg_replace 字符串并存储结果

java - Android 读取 csv

java - 类型参数 T 不在其范围内;应该扩展 MyBaseClass

mysql - 重复超过 2 列