Spring Data JPA - 以一对多关系删除子项

时间:2018-04-02 22:50:26

标签: java spring-data-jpa integration-testing

我正在实现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方法是否可以导致一组故障?如果我错了,我很想知道正确的答案。

提前致谢。

1 个答案:

答案 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);
}