【发布时间】:2017-04-01 13:08:59
【问题描述】:
我在 stackoverflow 上阅读了很多关于同一异常的线程,但我没有找到任何对我真正有帮助的东西,所以我在这里:
我有 2 个实体类:
教师班:
@Entity
@Table(name="teachers")
public class Teacher extends Model{
public Teacher()
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@OneToMany(fetch=FetchType.LAZY, mappedBy="teacher")
private List<Student> students;
//getter and setter
}
学生班:
@Entity
@Table(name="students")
public class Student extends Model{
public Student(){}
public Student(Teacher teacher){this.teacher = teacher;}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@ManyToOne(fetch=FetchType.LAZY, cascade={CascadeType.ALL})
@JoinColumn(name="teacher_id")
private Teacher teacher;
//getter and setter
}
模型类:
public abstract class Model implements Serializable {
public void save() {
EntityManager entityManager = HibernateUtil.getEntityManagerFactory().createEntityManager();
entityManager.getTransaction().begin();
entityManager.persist(this);
entityManager.getTransaction().commit();
entityManager.close();
}
public void merge(){
EntityManager entityManager = HibernateUtil.getEntityManagerFactory().createEntityManager();
entityManager.getTransaction().begin();
entityManager.merge(this);
entityManager.getTransaction().commit();
entityManager.close();
}
}
我创建了一个测试类来将一些值插入到数据库中:
public class TestClass{
Teacher teacher;
teacher = new Teacher();
Student student_1;
Student student_2;
student_1 = new Student(teacher);
student_1.save();
student_2 = new Student(teacher);
student_2.save();
}
student_2.save() 抛出异常(老师是一个分离的实体)。但为什么?我知道,那个老师已经被保留并且交易已经结束,但是 CascadeType.ALL 也包括合并,它应该处理它(或者显然不是......我在这里可能是错的)但是下面的工作:
student_2.merge() 代替 student_2.save() 有效~
另一种解决方案是在坚持学生之前删除 cascadeType.ALL 并坚持教师,但这不是我想要的。
【问题讨论】: