为什么我的实体在使用Spring数据JPA加载时只是部分填充?
我使用SpringDataJPA和DataNucleus作为JPA持久性提供程序,并具有类似为什么我的实体在使用Spring数据JPA加载时只是部分填充?,jpa,spring-data,spring-data-jpa,datanucleus,Jpa,Spring Data,Spring Data Jpa,Datanucleus,我使用SpringDataJPA和DataNucleus作为JPA持久性提供程序,并具有类似 interface BookRepository extends CrudRepository<Book, Long> { Book findByAuthorId(Long id); } 接口BookRepository扩展了Crudepository{ Book findByAuthorId(长id); } 如果我调用bookRepository.findByAuthorId(
interface BookRepository extends CrudRepository<Book, Long> {
Book findByAuthorId(Long id);
}
接口BookRepository扩展了Crudepository{
Book findByAuthorId(长id);
}
如果我调用bookRepository.findByAuthorId()
然后访问book.publishingHouse.manager.name
是null
。与在字段完全正确填充时调用bookRepository.findAll()
相反。我设置了datanucleus.DetachAllOnCommit=true
和datanucleus.maxFetchDepth=-1
(我还尝试了10)
知道原因吗?如果没有定义任何其他事务边界,则在离开查询方法时,
EntityManager
将关闭。这意味着您得到的是分离的实体,而您得到的加载状态是由持久性提供程序使用的默认值决定的
您基本上有两种选择:
- 让客户机(服务或控制器类)使用
保持@Transactional
打开,从而使加载的实例有资格延迟加载,以便在使用实例时从存储中拉出数据。如果控制器或服务不够,您可能需要查看EntityManager
/OpenEntityManagerInViewFilter
,该拦截器基本上保持-拦截器
打开,直到呈现视图EntityManager
- 使用JPA 2.1实体图(有关详细信息,请参阅)或通过手动定义向查询显式添加获取连接来定义应显式获取的内容
EntityManager
将关闭。这意味着您得到的是分离的实体,而您得到的加载状态是由持久性提供程序使用的默认值决定的
您基本上有两种选择:
- 让客户机(服务或控制器类)使用
保持@Transactional
打开,从而使加载的实例有资格延迟加载,以便在使用实例时从存储中拉出数据。如果控制器或服务不够,您可能需要查看EntityManager
/OpenEntityManagerInViewFilter
,该拦截器基本上保持-拦截器
打开,直到呈现视图EntityManager
- 使用JPA 2.1实体图(有关详细信息,请参阅)或通过手动定义向查询显式添加获取连接来定义应显式获取的内容
findAll()
是可行的。我们正在将一个空的条件查询传递给EntityManager
,用于findAll()
。看起来DataNucleus对这些问题的处理方式有所不同。很高兴听到你的工作,虽然!它与拦截器一起工作。让我困惑的是,使用findAll()
是可行的。我们正在将一个空的条件查询传递给EntityManager
,用于findAll()
。看起来DataNucleus对这些问题的处理方式有所不同。很高兴听到你的工作,虽然!