简体   繁体   English

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

[英]Spring JPA Cascade.ALL won't delete parent object

I'm following this "Bidirectional many-to-many with link entity lifecycle" tutorial here https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#associations-many-to-many . 我在这里遵循此“具有链接实体生命周期的双向多对多”教程https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#associations-many-to-many However, I'm using Spring JPA instead of Entity Manager. 但是,我使用的是Spring JPA而不是Entity Manager。 When I delete an address using repository interface, it isn't not deleting the PersonAddress record even though I've cascade ALL. 当我使用存储库接口删除地址时,即使我级联了ALL,也不会删除PersonAddress记录。 It's giving me Foreign Key constraint exception. 这给了我外键约束例外。

"Referential integrity constraint violation: "FKCYC1KRSXQELKM4UWH65AVIJ23: PUBLIC.PERSON_ADDRESS FOREIGN KEY(ADDRESS_ID) REFERENCES PUBLIC.ADDRESS(ID) (1)"; SQL statement:" “违反引用完整性约束:“ FKCYC1KRSXQELKM4UWH65AVIJ23:PUBLIC.PERSON_ADDRESS FOREIGN KEY(ADDRESS_ID)参考PUBLIC.ADDRESS(ID)(1)”; SQL语句:“

My classess are below. 我的课在下面。

@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 PersonAddress.java

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

    @Id
    @ManyToOne
    private Person person;

    @Id
    @ManyToOne
    private Address address;

Person.java 人.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 method that deletes the address after Person and Address are associated. 在Person和Address关联后删除地址的测试方法。 This should delete a record in PersonAddress because Address has Cascade.ALL but it isn't happening. 这应该删除PersonAddress中的一条记录,因为Address具有Cascade.ALL,但是它没有发生。 What am I missing? 我想念什么?

@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();

You're not correctly maintaining the two sides of the association. 您没有正确维护关联的两个方面。 personAddress1 referenced address1 , but address1 doesn't have any element in its list of owners. personAddress1引用了address1 ,但address1的所有者列表中没有任何元素。

So, when you're deleting address1 , Hibernate doesn't cascade the deletion to any owner, since it there isn't any in the list. 因此,当您删除address1 ,Hibernate不会将删除级联给任何所有者,因为列表中没有任何内容。 And the deletion thus fails because you're trying to delete an Address that is referenced by a PersonAddress , though a FK constraint. 由于FK约束,您试图删除PersonAddress引用的Address ,因此删除失败。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM