我正在实现Spring启动应用程序并在其中使用Spring Data JPA。如您所知,您不必仅为CRUD方法实现存储库接口,因为Spring Data JPA可以动态创建实现。所以我有这个:
public interface PersonRepository extends JpaRepository<Person, Long> {}
我正在处理一对多关系,这是在我的Person域中:
@OneToMany(cascade = CascadeType.ALL,
orphanRemoval = true,
fetch = FetchType.LAZY,
mappedBy = "person")
private Set<Contact> contacts = new HashSet<>();
我决定编写一个从父母那里删除子项的集成测试:
@Test
public void removeFromContacts() {
// given
Person person = new Person ("test person");
Contact contact = new Contact("test@gmail.com", "+123456789");
contact.setPerson(person);
person.getContacts().add(contact);
personRepository.save(person);
Person savedPerson = personRepository.findOne(person.getId());
Contact persistedContact = savedPerson.getContacts().stream().findFirst().orElse(null);
// when
savedPerson.getContacts().remove(persistedContact);
persistedContact.setPerson(null);
Person edited = personRepository.save(savedPerson);
// then
Assert.assertTrue(edited.getContacts().isEmpty());
}
此测试失败。原因是savedPerson.getContacts().remove(persistedContact)
行不会改变任何内容,remove
方法返回false。这很奇怪,因为我试图从散列集中删除一个对象,该散列集只有一个对象具有完全相同的散列码(equals()
方法也返回true)。根据{{3}}回答,联系对象在将其添加到哈希集后可能会以某种方式被更改。我唯一能想到的是它发生在这一行之后:personRepository.save(person)
。
如果我是对的,那我真的很困惑:我应该如何删除一个人的联系方式,即使我找到了办法,personRepository.save
方法是否可以导致一组故障?如果我错了,我很想知道正确的答案。
提前致谢。
答案 0 :(得分:0)
班级竞争和班级用户加入了一对一关系
public void delete(Integer integer){
User user = userRepository.findOne(integer);
Compte compte = user.getCompte();
compte.setUser(null);
compteRepository.save(compte);
user.setCompte(null);
userRepository.save(user);
compteRepository.delete(compte);
userRepository.delete(user);
}