Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot ManyTone FetchType.LAZY不起作用。获取列表时始终返回null_Spring Boot_Hibernate_Jpa_Lazy Loading - Fatal编程技术网

Spring boot ManyTone FetchType.LAZY不起作用。获取列表时始终返回null

Spring boot ManyTone FetchType.LAZY不起作用。获取列表时始终返回null,spring-boot,hibernate,jpa,lazy-loading,Spring Boot,Hibernate,Jpa,Lazy Loading,我正在使用JPA和Spring Boot。我有以下实体: @实体 公共课堂用书{ @身份证 @GeneratedValue(策略=GenerationType.AUTO) 私人长id; @列(nullable=false,unique=true) 私有字符串标题; @列(nullable=false) 私有字符串作者; @manytone(fetch=FetchType.LAZY) @JoinColumn(name=“bookshelf\u id”,referencedColumnName=“i

我正在使用JPA和Spring Boot。我有以下实体:

@实体
公共课堂用书{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
@列(nullable=false,unique=true)
私有字符串标题;
@列(nullable=false)
私有字符串作者;
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“bookshelf\u id”,referencedColumnName=“id”,nullable=true)
私人书架;
//吸气剂和塞特
}
@实体
公共类书架{
@身份证
@生成值
私人长id;
@列(nullable=false)
私有字符串位置;
@OneToMany(mappedBy=“bookshelf”,fetch=FetchType.LAZY)
私人书目;
//吸气剂和塞特
}
然后在我的测试中,我尝试检索放在书架上的书:

书架=新书架(“A室”);
书=新书(“一本书”,“克里斯”);
书柜(书架);;
entityManager.persist(book);
entityManager.persist(shelf);
entityManager.flush();
Bookshelf persistedShelf=bookshelfrespository.findById(shelf.getId()).get();
Book persistedBook=bookRepository.findById(Book.getId()).get();
book=null;
shelf=null;
shelf=persistedBook.getBookshelf();
int count=persistedShelf.getBooks().size();
资产质量(1,计数);
测试失败,因为getBooks()在此行中始终返回null:

int count=persistedShelf.getBooks().size();
测试日志显示仅执行两个SQL命令:

Hibernate:将值(?,)插入书架(位置,id)
Hibernate:在书中插入(作者、书架id、标题、id)值(?,,,?)

有什么问题吗?

还可以尝试设置书架与书本之间的反向关系:

书架=新书架(“A室”);
书=新书(“一本书”,“克里斯”);
书柜(书架);
//新代码如下:
List books=new ArrayList();
图书。添加(图书);
书架、书架(书);
entityManager.persist(book);
entityManager.persist(shelf);
entityManager.flush();

一般来说,您负责管理JPA/Hibernate中关系的双方。

有趣的是,如果存在一个现有书架(id=1)和DB中的书籍,BookshelfRespository.findById(1)返回一个书架,其中包含非空书籍。似乎是从DB加载,框架为您填充书籍,而对于新创建的书籍,它不会。你知道吗?当你从数据库中加载这样的数据时,Hibernate已经知道了这些关系的存在。但是在上面的场景中它不知道这一点。bookshelfRepository.findById(1).get()返回包含非空书籍的书架,但是bookshelfRepository.findById(shelf.getId()).get()不返回。这个API不一致,这可能会让程序员感到困惑。事实上,保存后,框架应该了解连接,并且应该填充书籍。