PersistenceException:传递给persist的分离实体

时间:2016-11-17 20:18:32

标签: java hibernate jpa

我在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并在坚持学生之前坚持老师,但这不是我想要的。

1 个答案:

答案 0 :(得分:0)

Cascade的工作方式与您的想法不同。它在相关对象上调用相同的函数。因此,如果你打电话给em.persist(学生),它会坚持教师。

我想你可能不希望从学生到老师级联任何东西。如果您在交易中坚持教师,然后只将其链接到其他交易中的学生,则您没有向教师提供任何级联。