这是我的学生实体,
@Entity
@Access(AccessType.FIELD)
@Table(name="TBL_STUDENT")
public class Student implements Serializable{
.....
.....
....
..
.
@OneToOne( targetEntity=StudentContact.class,
fetch=FetchType.LAZY,
cascade={CascadeType.ALL}
)
@JoinColumn(name="CONTACT_ID")
private StudentContact contact;
.....
...
..
}
这是我的 StudentContact 实体,如下所示,
@Entity
@Table(name="TBL_STD_CONTACT")
public class StudentContact implements Serializable{
......
....
..
@OneToOne( mappedBy="contact",
targetEntity=Student.class,
cascade={
CascadeType.PERSIST,
CascadeType.MERGE
}
fetch= FetchType.LAZY)
private Student student;
........
......
....
..
.
}
My StudentTest.java 包含我尝试执行的主要方法:
tx = em.getTransaction();
tx.begin();
StudentContact contact = em.find(StudentContact.class,38);
em.remove(contact);
tx.commit();
上述操作不会删除StudentContact实体。 当我检查日志时,它只显示了StudentContact和Student的Select查询,但没有打印Delete查询,也没有显示任何异常。
我哪里出错了?
最佳答案
从 Student 到 StudentContact 可能存在引用完整性约束(外键)。因此您无法删除 StudentContact,因为学生会指向不存在的实体。
您必须首先删除此引用,例如:
tx = em.getTransaction();
tx.begin();
StudentContact contact = em.find(StudentContact.class,38);
Student student = contact.getStudent();
student.setContact(null);
contact.setStudent(null);
em.merge(student);
em.remove(em.merge(contact));
tx.commit();
关于JPA 双向关系中的一对一实体删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15220573/