gpt4 book ai didi

由于嵌入式组件的递归,Hibernate refresh() 导致堆栈溢出

转载 作者:行者123 更新时间:2023-12-04 03:08:06 25 4
gpt4 key购买 nike

我有一个遗留数据库,我正尝试使用 Hibernate 3 访问它。

在这个数据库中,我有两个实体:AB,第三个实体C 表示A< 之间的关系/strong> 和 BC 实体还包含一些关于关系的附加信息,因此它不能像 @ManyToMany 一样编码。

C 实体使用@Id 和@ManyToOne 注释引用AB 实体。AB 实体使用 @OneToMany 注释将 C 实体列为集合。

底层数据库可能会改变,所以我尝试使用 Hibernate refresh() 过程从数据库中重新读取 A 实体的数据。

这会导致无限递归循环:A->C->A->C.. . 这会导致堆栈溢出。

似乎这个refresh() 过程试图以无限深度刷新每个引用,包括惰性引用。这对我来说并不是真正必要的,如果我可以进行“浅”刷新并将所有 @OneToMany 设置重置回“未初始化”状态,就足够了。

所以我的问题是:

我怎样才能避免这种无休止的递归

我怎样才能将实体“重置”回“未初始化”状态

下面是使用 Eclipse 生成的堆栈跟踪的一部分。

SingleTableEntityPersister(AbstractEntityPersister).load(Serializable, Object, LockOptions, SessionImplementor) line: 3293
DefaultLoadEventListener.loadFromDatasource(LoadEvent, EntityPersister, EntityKey, LoadEventListener$LoadType) line: 496
DefaultLoadEventListener.doLoad(LoadEvent, EntityPersister, EntityKey, LoadEventListener$LoadType) line: 477
DefaultLoadEventListener.load(LoadEvent, EntityPersister, EntityKey, LoadEventListener$LoadType) line: 227
DefaultLoadEventListener.proxyOrLoad(LoadEvent, EntityPersister, EntityKey, LoadEventListener$LoadType) line: 285
DefaultLoadEventListener.onLoad(LoadEvent, LoadEventListener$LoadType) line: 152
SessionImpl.fireLoad(LoadEvent, LoadEventListener$LoadType) line: 1090
SessionImpl.internalLoad(String, Serializable, boolean, boolean) line: 1038
ManyToOneType(EntityType).resolveIdentifier(Serializable, SessionImplementor) line: 630
ManyToOneType(EntityType).resolve(Object, SessionImplementor, Object) line: 438
EmbeddedComponentType(ComponentType).resolve(Object, SessionImplementor, Object) line: 617
CascadeEntityLoader(Loader).extractKeysFromResultSet(Loadable[], QueryParameters, ResultSet, SessionImplementor, EntityKey[], LockMode[], List) line: 722
CascadeEntityLoader(Loader).getRowFromResultSet(ResultSet, SessionImplementor, QueryParameters, LockMode[], EntityKey, List, EntityKey[], boolean) line: 606
CascadeEntityLoader(Loader).doQuery(SessionImplementor, QueryParameters, boolean) line: 829
CascadeEntityLoader(Loader).doQueryAndInitializeNonLazyCollections(SessionImplementor, QueryParameters, boolean) line: 274
CascadeEntityLoader(Loader).loadEntity(SessionImplementor, Object, Type, Object, String, Serializable, EntityPersister, LockOptions) line: 2037
CascadeEntityLoader(AbstractEntityLoader).load(SessionImplementor, Object, Object, Serializable, LockOptions) line: 86
CascadeEntityLoader(AbstractEntityLoader).load(Serializable, Object, SessionImplementor, LockOptions) line: 76
SingleTableEntityPersister(AbstractEntityPersister).load(Serializable, Object, LockOptions, SessionImplementor) line: 3293
DefaultLoadEventListener.loadFromDatasource(LoadEvent, EntityPersister, EntityKey, LoadEventListener$LoadType) line: 496
DefaultLoadEventListener.doLoad(LoadEvent, EntityPersister, EntityKey, LoadEventListener$LoadType) line: 477
DefaultLoadEventListener.load(LoadEvent, EntityPersister, EntityKey, LoadEventListener$LoadType) line: 227
DefaultLoadEventListener.proxyOrLoad(LoadEvent, EntityPersister, EntityKey, LoadEventListener$LoadType) line: 285
DefaultLoadEventListener.onLoad(LoadEvent, LoadEventListener$LoadType) line: 152
SessionImpl.fireLoad(LoadEvent, LoadEventListener$LoadType) line: 1090
SessionImpl.internalLoad(String, Serializable, boolean, boolean) line: 1038
ManyToOneType(EntityType).resolveIdentifier(Serializable, SessionImplementor) line: 630
ManyToOneType(EntityType).resolve(Object, SessionImplementor, Object) line: 438
EmbeddedComponentType(ComponentType).resolve(Object, SessionImplementor, Object) line: 617
CascadeEntityLoader(Loader).extractKeysFromResultSet(Loadable[], QueryParameters, ResultSet, SessionImplementor, EntityKey[], LockMode[], List) line: 722
CascadeEntityLoader(Loader).getRowFromResultSet(ResultSet, SessionImplementor, QueryParameters, LockMode[], EntityKey, List, EntityKey[], boolean) line: 606
CascadeEntityLoader(Loader).doQuery(SessionImplementor, QueryParameters, boolean) line: 829
CascadeEntityLoader(Loader).doQueryAndInitializeNonLazyCollections(SessionImplementor, QueryParameters, boolean) line: 274
CascadeEntityLoader(Loader).loadEntity(SessionImplementor, Object, Type, Object, String, Serializable, EntityPersister, LockOptions) line: 2037
CascadeEntityLoader(AbstractEntityLoader).load(SessionImplementor, Object, Object, Serializable, LockOptions) line: 86
CascadeEntityLoader(AbstractEntityLoader).load(Serializable, Object, SessionImplementor, LockOptions) line: 76
SingleTableEntityPersister(AbstractEntityPersister).load(Serializable, Object, LockOptions, SessionImplementor) line: 3293
DefaultRefreshEventListener.onRefresh(RefreshEvent, Map) line: 151
DefaultRefreshEventListener.onRefresh(RefreshEvent) line: 62
SessionImpl.fireRefresh(RefreshEvent) line: 1118
SessionImpl.refresh(Object) line: 1098
EntityManagerImpl(AbstractEntityManagerImpl).refresh(Object, LockModeType, Map<String,Object>) line: 903
EntityManagerImpl(AbstractEntityManagerImpl).refresh(Object) line: 878

...

最佳答案

我从 @OneToMany 声明中删除了 CascadeType.REFRESH 属性。现在 Hibernate 重新读取@OneToMany 集合,但不会尝试重新读取其成员。

看起来像是一种解决方法,但这正是我所需要的。

关于由于嵌入式组件的递归,Hibernate refresh() 导致堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8354005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com