有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring JPA Cascade。ALL不会删除父对象

下面是“链接实体生命周期的双向多对多”教程https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#associations-many-to-many。然而,我使用的是Spring JPA,而不是实体管理器。当我使用repository接口删除一个地址时,它并不是在删除PersonalAddress记录,尽管我已经级联了所有记录。它给了我外键约束例外

“引用完整性约束冲突:”FKCYC1KRSXQELKM4UWH65AVIJ23:公共。个人地址外键(地址ID)引用公共。地址(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<>();

个人地址。爪哇

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

    @Id
    @ManyToOne
    private Person person;

    @Id
    @ManyToOne
    private Address address;

人。爪哇

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

在人员和地址关联后删除地址的测试方法。这应该会删除PersonalAddress中的一条记录,因为地址已级联。但这一切都没有发生。我错过了什么

@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) 个答案

  1. # 1 楼答案

    你没有正确地维护协会的双方personAddress1引用了address1,但address1的所有者列表中没有任何元素

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