JPA 双向关系中的一对一实体删除

标签 jpa sql-delete one-to-one bidirectional

这是我的学生实体,

@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/

相关文章:

java - 集成 JPA2.0 和 Spring

c# - 如何删除具有相同相册 ID 的所有图像文件?

mysql - DELETE FROM 抛出 SQL 错误 [1064] [42000] : (conn=5159) on a query,,而 SELECT 在该错误上

java - JPA中表之间的关系是如何设置的?

java - 使用hibernate,如何在xml中编写@OneToMany(mappedBy ="somethingFkId")?

java - 如何将 @Entity 和 @XmlRootElement 组合在一个类中

java - @SequenceGenerator 在用@MappedSuperclass 注释的类上

c# - 从datagridview中删除数据库

python - django 什么时候运行 OneToOneField 的查询?

java - Hibernate一对一XML映射不插入外键