为什么我的实体在使用Spring Data JPA加载时仅部分填充?

时间:2015-03-16 23:00:01

标签: jpa spring-data spring-data-jpa datanucleus

我使用Spring Data JPA和DataNucleus作为JPA持久性提供程序,并且有类似

的内容
interface BookRepository extends CrudRepository<Book, Long> {
    Book findByAuthorId(Long id);
}

如果我致电bookRepository.findByAuthorId(),则访问book.publishingHouse.manager.namenull。而不是在字段正确填充时调用bookRepository.findAll()。我设置datanucleus.DetachAllOnCommit=truedatanucleus.maxFetchDepth=-1(我也试过10)。

知道为什么吗?

1 个答案:

答案 0 :(得分:4)

如果您没有定义任何其他事务边界,则在离开查询方法时EntityManager会关闭。这意味着你得到的是分离的实体,你得到的负载状态由持久性提供程序使用的默认值决定。

您基本上有两个选择:

  • 使用@Transactional使客户端(服务或控制器类)保持EntityManager打开,因此加载的实例有资格进行延迟加载,以便在您使用时将数据从商店中拉出实例。如果控制器或服务不够,您可能需要查看OpenEntityManagerInViewFilter / -Interceptor,它基本上保持EntityManager打开,直到呈现视图。

  • 使用JPA 2.1实体图定义应该显式获取的内容(有关详细信息,请参阅reference docs)或通过手动定义查询显式添加fetch-joins。