返回@OneToMany上的空列表,确实是0到多(可为空)

时间:2017-09-28 10:41:46

标签: java sql spring jpa join

我有一个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);
}

1 个答案:

答案 0 :(得分:2)

这样做:

@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "personId", referencedColumnName = "managerId", updatable = false, insertable = false, nullable = true)
private List<Person> managers = new ArrayList<>();