当前位置: 首页 > 知识库问答 >
问题:

Spring JPA Cascade.all不会删除父对象

上官和韵
2023-03-14

我正在这里学习“带有链接实体生命周期的双向多对多”教程https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/hibernate_user_guide.html#associations-many-to-many。但是,我使用的是Spring JPA而不是实体管理器。当我使用repository接口删除一个地址时,这并不是不删除PersonAddress记录,即使我已经级联了所有。它给了我外键约束异常。

引用完整性约束冲突:“FKCYC1KRSXQELKM4UWH65AVIJ23:public.person_address外键(ADDRESS_ID)引用public.address(ID)(1)”;SQL语句:“

我的同学在下面。

@Entity(name = "Address")
public class Address  {

@Id
@GeneratedValue
private Long id;

private String street;

@Column(name = "number")
private String number;

private String postalCode;

@OneToMany(mappedBy = "address", cascade = {CascadeType.ALL}, orphanRemoval = true, fetch=FetchType.LAZY)
private List<PersonAddress> owners = new ArrayList<>();

PersonAddress.java

 @Entity(name = "PersonAddress")
    public class PersonAddress implements Serializable {

    @Id
    @ManyToOne
    private Person person;

    @Id
    @ManyToOne
    private Address address;

person.java

@Entity(name = "Person")
public class Person{

    @Id
    @GeneratedValue
    private Long id;

    @NaturalId
    private String registrationNumber;

    @OneToMany(mappedBy = "person", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<PersonAddress> addresses = new ArrayList<>();
@Test
@Transactional
public void testDeleteAddressAfterPatronAdd() {

Person person1 = new Person("ABC-123");
Person person2 = new Person("DEF-456");
Address address1 = new Address("12th Avenue", "12A", "4005A");
Address address2 = new Address("18th Avenue", "18B", "4007B");

Person savedPerson1 = personRepository.save(person1);
Person savedPerson2 = personRepository.save(person2);       
Address savedAddress1 = addressRepository.save(address1);
Address savedAddress2 = addressRepository.save(address2);
personRepository.flush();       
addressRepository.flush();

PersonAddress personAddress1 = new PersonAddress(savedPerson1, savedAddress1);      
PersonAddress personAddress2 = new PersonAddress(savedPerson2, savedAddress2);
savedPerson1.getAddresses().add(personAddress1);
savedPerson2.getAddresses().add(personAddress2);
personRepository.flush();       
addressRepository.flush();

Address loadedAddress1 = addressRepository.findById(savedAddress1.getId());
loadedAddress1.getOwners();
addressRepository.delete(loadedAddress1);       
addressRepository.flush();

共有1个答案

柯瀚玥
2023-03-14

您没有正确地维护关联的两面。PersonAddress1引用了Address1,但Address1的所有者列表中没有任何元素。

因此,当您删除address1时,Hibernate不会将删除级联到任何所有者,因为列表中没有任何所有者。因此删除失败,因为您试图删除PersonAddress引用的Address(通过FK约束)。

 类似资料:
  • 我的实体。ValidationStep与documentDetail有一对一的关系,documentDetail与documentValidations有一个完全的关系 我的删除查询 父ValidationStep被删除,但是docDetail和documentValidations仍然在数据库中。

  • 删除父实体时,我还想删除关联的子实体(从数据库中)。我试图在删除时使用级联,如下所示,但我一定做错了什么。 当对父实体对象调用删除时,我收到错误消息:“该实体仍在数据库的其他地方引用”。我可以确认该实体在数据库的其他地方引用的唯一地方是在下面的两个表中(如果我手动从数据库中删除子行,对父实体对象的删除调用工作正常)。在过去的9个小时里,我一直在阅读实体对象并尝试不同的东西。我做错了什么? 这是我的

  • 我有以下文件和文件夹结构: 我注册了两个WatchServices,一个用于文件夹,另一个用于。对于这两个我都注册了事件:,,。 当我删除时,我希望得到一个用于删除文件夹的事件和两个事件用于和。事实上,我只得到的事件。当我只删除时,我得到一个预期的删除事件。 这是正常行为吗?如何使用WatchService获取已删除文件夹内的文件列表?

  • 编辑:修改问题以更好地反映问题。此处最初发布的问题 我有一个父实体(< code >上下文)和一个子实体(< code >用户)。父级上的级联“删除”不会删除子级。代码如下:

  • 我有两个实体使用Spring和Hibernate

  • 问题内容: 我有成员类的简单ArrayLists: 会员等级: 朋友的ArrayList包含所有用户朋友。我只希望从好友列表中删除组成员(如果存在): 但这对列表没有任何帮助… 查看日志语句,该朋友实际上确实出现在列表中。 为什么不起作用? 问题答案: 如何确定2个成员相等?我猜它们是否具有相同的ID,您认为它们相等,但是Java希望它们成为内存中的完全相同的引用,而事实并非如此。要更正此问题,您