我使用Spring Data JPA和DataNucleus作为JPA持久性提供程序,并且有类似
的内容interface BookRepository extends CrudRepository<Book, Long> {
Book findByAuthorId(Long id);
}
如果我致电bookRepository.findByAuthorId()
,则访问book.publishingHouse.manager.name
为null
。而不是在字段正确填充时调用bookRepository.findAll()
。我设置datanucleus.DetachAllOnCommit=true
和datanucleus.maxFetchDepth=-1
(我也试过10)。
知道为什么吗?
答案 0 :(得分:4)
如果您没有定义任何其他事务边界,则在离开查询方法时EntityManager
会关闭。这意味着你得到的是分离的实体,你得到的负载状态由持久性提供程序使用的默认值决定。
您基本上有两个选择:
使用@Transactional
使客户端(服务或控制器类)保持EntityManager
打开,因此加载的实例有资格进行延迟加载,以便在您使用时将数据从商店中拉出实例。如果控制器或服务不够,您可能需要查看OpenEntityManagerInViewFilter
/ -Interceptor
,它基本上保持EntityManager
打开,直到呈现视图。
使用JPA 2.1实体图定义应该显式获取的内容(有关详细信息,请参阅reference docs)或通过手动定义查询显式添加fetch-joins。