我有一个FK递归指向同一个实体,但它不能为空
人实体:
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "personId", referencedColumnName = "managerId", updatable = false, insertable = false, nullable = true)
private List<Person> managers;
但是当join为null时,返回null而不是空列表。问题是我不确定它是错误还是设计错误。在调试时,孩子将管理员显示为一个持久的包,但是孤儿没有空的持久性包但是没有值。
但在这个问题中,用户确认列表应始终初始化:To initialize or not initialize JPA relationship mappings?
仅供参考,因为所有代码都在@Transactional
内,所以没有LazyLoadingExceptions在另一个问题(JPA OneToMany - Collection is null)中,有一个关于JPA使用noargs构造函数和直接从db设置字段的解释,所以我想知道问题是JPA是否将列表设置为null,因为fb将join列返回null。如果是这种情况,是否可以告诉JPA发送空列表而不是null?
提取代码是一个测试:
@Test
@Transactional
public void fetchManagersOfCEO(){
Person person = this.personRepository.findOne(1L);
assertThat(result.getManagers().size()).isEqualTo(0);
}
当id是具有上述经理
的员工之一时,此回报期望经理P.S&GT;经过大量的调试,问题是JPA将集合设置为null,没有&#34; COLLECTION NOT NULL&#34; ObjectMarker和空CollectionReferenceInitializers
我不喜欢它,但我找到解决问题的唯一方法是:
public List<Person> getManagers(){
return Optional.ofNullable(this.managers).orElseGet(ArrayList::new);
}
答案 0 :(得分:2)
这样做:
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "personId", referencedColumnName = "managerId", updatable = false, insertable = false, nullable = true)
private List<Person> managers = new ArrayList<>();