我在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();
}
}
我创建了一个Test类,将一些值插入db:
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并在坚持学生之前坚持老师,但这不是我想要的。
答案 0 :(得分:0)
Cascade的工作方式与您的想法不同。它在相关对象上调用相同的函数。因此,如果你打电话给em.persist(学生),它会坚持教师。
我想你可能不希望从学生到老师级联任何东西。如果您在交易中坚持教师,然后只将其链接到其他交易中的学生,则您没有向教师提供任何级联。