spring - 在 Spring Data JPA Entity 中获取集合,抛出堆栈溢出异常
问题描述
我想从一个实体中获取一个集合类型变量,并且该集合使用@OneToMany 进行注释。
public class Cheat {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "cheat_seq", length = 10)
private Long cheatSeq;
@OneToMany(mappedBy = "cheat", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
private Set<CheatVote> vote;
}
上述实体具有投票成员变量。我想得到它,但是当我调用cheat.getVote()时,它会抛出错误。
此外,CheatVote 实体看起来像:
public class CheatVote{
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Id
@Column(name="seq", nullable=false)
private Long seq;
@JoinColumn(name="cheat_fk", referencedColumnName="cheat_seq")
@ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
@NonNull
private Cheat cheat;
}
如前所述,我调用了 cheat.getVote();
@Test
public void test23123() throws Exception{
cheatService.addCheat(addDTO1);
Cheat cheat = cheatService.findAll().get(0);
assertNull(cheat.getVote());
cheatVoteService.addGoodVote(cheat.getCheatSeq(), "127.0.0.1");
cheat = cheatService.findOne(cheat.getCheatSeq());
//cheat.getVote();
}
控制台中的部分错误堆栈如下:
2018-10-14 07:34:14.414 WARN 11852 --- [ main] o.h.e.loading.internal.LoadContexts : HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@63a7af06<rs=HikariProxyResultSet@1779202806 wrapping com.mysql.jdbc.JDBC42ResultSet@2762253e>
2018-10-14 07:34:14.414 WARN 11852 --- [ main] o.h.e.loading.internal.LoadContexts : HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@5f01fb5c<rs=HikariProxyResultSet@460107127 wrapping com.mysql.jdbc.JDBC42ResultSet@18ca9277>
2018-10-14 07:34:14.435 WARN 11852 --- [ main] o.h.e.loading.internal.LoadContexts : HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@75c77add<rs=HikariProxyResultSet@209972599 wrapping com.mysql.jdbc.JDBC42ResultSet@21688427>
2018-10-14 07:34:14.436 WARN 11852 --- [ main] o.h.e.loading.internal.LoadContexts : HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@d5e3f55<rs=HikariProxyResultSet@1786422901 wrapping com.mysql.jdbc.JDBC42ResultSet@2dd2ff87>
2018-10-14 07:34:14.436 WARN 11852 --- [ main] o.h.e.loading.internal.LoadContexts : HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@53df7e67<rs=HikariProxyResultSet@1398327546 wrapping com.mysql.jdbc.JDBC42ResultSet@4a6ef712>
2018-10-14 07:34:14.436 WARN 11852 --- [ main] o.h.e.loading.internal.LoadContexts : HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@3d4b45b<rs=HikariProxyResultSet@1198265211 wrapping com.mysql.jdbc.JDBC42ResultSet@56d5460f>
2018-10-14 07:34:14.436 WARN 11852 --- [ main] o.h.e.loading.internal.LoadContexts : HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@4d0b276e<rs=HikariProxyResultSet@618095995 wrapping com.mysql.jdbc.JDBC42ResultSet@7614378d>
2018-10-14 07:34:14.436 WARN 11852 --- [ main] o.h.e.loading.internal.LoadContexts : HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@31531d0d<rs=HikariProxyResultSet@96665725 wrapping com.mysql.jdbc.JDBC42ResultSet@303fbc4>
2018-10-14 07:34:14.436 WARN 11852 --- [ main] o.h.e.loading.internal.LoadContexts : HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@19d76106<rs=HikariProxyResultSet@1722528506 wrapping com.mysql.jdbc.JDBC42ResultSet@25dad235>
2018-10-14 07:34:14.436 WARN 11852 --- [ main] o.h.e.loading.internal.LoadContexts : HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@3f87780b<rs=HikariProxyResultSet@208438522 wrapping com.mysql.jdbc.JDBC42ResultSet@72168258>
2018-10-14 07:34:14.506 INFO 11852 --- [ Thread-3] o.s.w.c.s.GenericWebApplicationContext : Closing org.springframework.web.context.support.GenericWebApplicationContext@5fb759d6: startup date [Sun Oct 14 07:33:53 KST 2018]; root of context hierarchy
2018-10-14 07:34:14.550 INFO 11852 --- [ Thread-3] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2018-10-14 07:34:14.554 INFO 11852 --- [ Thread-3] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2018-10-14 07:34:14.581 INFO 11852 --- [ Thread-3] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
JUnit 错误面板中的部分错误堆栈如下:
at org.hibernate.collection.internal.PersistentSet.hashCode(PersistentSet.java:430)
at com.aibiigae1221.skyQuiz.data.entity.Cheat.hashCode(Cheat.java:30)
at com.aibiigae1221.skyQuiz.data.entity.CheatVote.hashCode(CheatVote.java:21)
at java.util.HashMap.hash(HashMap.java:338)
at java.util.HashMap.put(HashMap.java:611)
at java.util.HashSet.add(HashSet.java:219)
at java.util.AbstractCollection.addAll(AbstractCollection.java:344)
at org.hibernate.collection.internal.PersistentSet.endRead(PersistentSet.java:327)
at org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollection(CollectionLoadContext.java:234)
at org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:221)
at org.hibernate.engine.loading.internal.CollectionLoadContext.endLoadingCollections(CollectionLoadContext.java:194)
at org.hibernate.loader.plan.exec.process.internal.CollectionReferenceInitializerImpl.endLoading(CollectionReferenceInitializerImpl.java:154)
at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.finishLoadingCollections(AbstractRowReader.java:249)
at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.finishUp(AbstractRowReader.java:212)
at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:133)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:122)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:86)
at org.hibernate.loader.collection.plan.AbstractLoadPlanBasedCollectionInitializer.initialize(AbstractLoadPlanBasedCollectionInitializer.java:87)
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:688)
at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:75)
at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:2223)
at org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:565)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:247)
at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:561)
at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:132)
我的spring boot版本是2.0.5.RELEASE,Maven中的Spring data jpa版本(我没有手动配置)是2.0.10.RELEASE
什么地方出了错 ??
解决方案
如果您想接收完全初始化的实体,则 Fetch 类型应该是 EAGER 而不是 LAZY。使用默认模式 ( LAZY ) Hibernate 不会费心初始化相关对象。
推荐阅读
- javascript - 找不到脚本函数:myFunction
- python-2.7 - 将py文件转换为exe时缺少dll
- azure - 带有 EventGridTrigger 的 Azure Function 阻止 FunctionsStartup 类的 Configure 方法运行
- azure-functions - 如何在 azure 函数中重复调用 context.bindings
- python - 无法在 Pyqt5 上保存我的窗口的大小和位置
- excel - 如何在不提示用户丢失数据的情况下将 XLSM 文件保存为 XLSX 文件?
- uiview - 如何以及何时调用 setNeedsLayout() 方法以便在父视图上布局子视图?
- magento - 下单成功后仅触发一次的事件
- asp.net-core - 找不到“IFormFile”(您使用的是指令还是程序集引用?)
- firebase - Flutter Cloud Firestore 范围基础查询