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 楼答案
你没有正确地维护协会的双方
personAddress1
引用了address1
,但address1
的所有者列表中没有任何元素因此,当您删除
address1
时,Hibernate不会将删除级联到任何所有者,因为列表中没有任何所有者。因此,删除失败,因为您试图删除Address
引用的PersonAddress
,尽管是FK约束