Spring boot ManyTone FetchType.LAZY不起作用。获取列表时始终返回null
我正在使用JPA和Spring Boot。我有以下实体: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
@实体
公共课堂用书{
@身份证
@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不一致,这可能会让程序员感到困惑。事实上,保存后,框架应该了解连接,并且应该填充书籍。