为什么我的实体在使用 Spring Data JPA 加载时只填充了一部分?
Why are my entities only partially populated when loading them using Spring Data JPA?
我正在使用 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)。
知道为什么吗?
如果您没有定义任何额外的事务边界,则 EntityManager
在离开查询方法时关闭。这意味着您返回的是分离的实体,您返回的加载状态类型由持久性提供程序使用的默认值决定。
你基本上有两个选择:
有一个客户端(服务或控制器 class)使用 @Transactional
来保持 EntityManager
打开,因此加载的实例有资格延迟加载以拉取在您使用实例时从存储中取出数据。如果控制器或服务还不够,您可能想查看 OpenEntityManagerInViewFilter
/-Interceptor
,它基本上保持 EntityManager
打开,直到呈现视图。
使用 JPA 2.1 实体图(有关详细信息,请参阅 reference docs)或通过手动定义将获取连接显式添加到查询中,定义应显式获取的内容。
我正在使用 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)。
知道为什么吗?
如果您没有定义任何额外的事务边界,则 EntityManager
在离开查询方法时关闭。这意味着您返回的是分离的实体,您返回的加载状态类型由持久性提供程序使用的默认值决定。
你基本上有两个选择:
有一个客户端(服务或控制器 class)使用
@Transactional
来保持EntityManager
打开,因此加载的实例有资格延迟加载以拉取在您使用实例时从存储中取出数据。如果控制器或服务还不够,您可能想查看OpenEntityManagerInViewFilter
/-Interceptor
,它基本上保持EntityManager
打开,直到呈现视图。使用 JPA 2.1 实体图(有关详细信息,请参阅 reference docs)或通过手动定义将获取连接显式添加到查询中,定义应显式获取的内容。