我碰巧在 Spring Data JDBC(使用 Spring Boot 2.1 和必要的启动器)聚合处理中遇到了一些非常奇怪的东西。让我解释一下那个案例(我正在使用 Lombok,不过这个问题可能是相关的)......
这是我的实体的摘录:
import java.util.Set;
@Data
public class Person {
@Id
private Long id;
...
private Set<Address> address;
}
这是一个关联的 Spring Data 存储库:
public interface PersonsRepository extends CrudRepository<Person, Long> {
}
这是一个失败的测试:
@Autowired
private PersonsRepository personDao;
...
Person person = personDao.findById(1L).get();
Assert.assertTrue(person.getAddress().isEmpty());
person.getAddress().add(myAddress); // builder made, whatever
person = personDao.save(person);
Assert.assertEquals(1, person.getAddress().size()); // count is... 2!
事实是,通过调试,我发现地址集合(它是一个集合)包含附加地址的同一实例的两个引用。我没有看到两个引用是如何结束的,最重要的是,一个 SET(实际上是一个 LinkedHashSet,为了记录)如何处理同一个实例 TWICE!
person Person (id=218)
address LinkedHashSet<E> (id=228)
[0] Address (id=206)
[1] Address (id=206)
有人知道这种情况吗?谢谢