2012-04-23 68 views
1

在我當前的項目中,我使用Hibernate 3.我正在使用的工具連接到MS SQL Server數據庫。該工具安裝在兩臺不同的機器上,都連接到同一個數據庫。Stackoverflowerror/Unresolved Object Exception with Hibernate,Collections and Session.refresh(...)

在第一臺機器上,我改變了一個包含一個集合的對象。在第二臺機器上,我使用session.refresh(...)查看第一臺機器上所做的更改。

當我添加一個對象到集合和刷新,我得到一個Stackoverflowerror。當我從集合中刪除一個對象並刷新時,我得到一個UnresolvedObjectException。

session.evict(...) 
session.get(...) 

似乎工作。但session.refresh(...)。爲什麼?

這是一個完整的堆棧跟蹤:

java.lang.StackOverflowError 
at net.sourceforge.jtds.jdbc.JtdsStatement.<init>(JtdsStatement.java:129) 
at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.<init>(JtdsPreparedStatement.java:99) 
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.prepareStatement(ConnectionJDBC2.java:2456) 
at net.sourceforge.jtds.jdbc.ConnectionJDBC2.prepareStatement(ConnectionJDBC2.java:2414) 
at net.sourceforge.jtds.jdbcx.proxy.ConnectionProxy.prepareStatement(ConnectionProxy.java:394) 
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534) 
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:452) 
at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161) 
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1573) 
at org.hibernate.loader.Loader.doQuery(Loader.java:696) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 
at org.hibernate.loader.Loader.loadEntity(Loader.java:1881) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:71) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:65) 
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3072) 
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:434) 
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:415) 
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:165) 
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:207) 
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:126) 
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:905) 
at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:873) 
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:590) 
at org.hibernate.type.EntityType.resolve(EntityType.java:412) 
at org.hibernate.type.ComponentType.resolve(ComponentType.java:607) 
at org.hibernate.type.ComponentType.nullSafeGet(ComponentType.java:298) 
at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:1121) 
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:588) 
at org.hibernate.loader.Loader.doQuery(Loader.java:724) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 
at org.hibernate.loader.Loader.loadEntity(Loader.java:1881) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:71) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:65) 
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3072) 
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:434) 
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:415) 
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:165) 
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:207) 
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:126) 
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:905) 
at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:873) 
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:590) 
at org.hibernate.type.EntityType.resolve(EntityType.java:412) 
at org.hibernate.type.ComponentType.resolve(ComponentType.java:607) 
at org.hibernate.type.ComponentType.nullSafeGet(ComponentType.java:298) 
at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:1121) 
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:588) 
at org.hibernate.loader.Loader.doQuery(Loader.java:724) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 
at org.hibernate.loader.Loader.loadEntity(Loader.java:1881) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:71) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:65) 
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3072) 
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:434) 
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:415) 
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:165) 
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:207) 
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:126) 
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:905) 
at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:873) 
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:590) 
at org.hibernate.type.EntityType.resolve(EntityType.java:412) 
at org.hibernate.type.ComponentType.resolve(ComponentType.java:607) 
at org.hibernate.type.ComponentType.nullSafeGet(ComponentType.java:298) 
at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:1121) 
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:588) 
at org.hibernate.loader.Loader.doQuery(Loader.java:724) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 
at org.hibernate.loader.Loader.loadEntity(Loader.java:1881) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:71) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:65) 
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3072) 
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:434) 
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:415) 
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:165) 
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:207) 
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:126) 
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:905) 
at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:873) 
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:590) 
at org.hibernate.type.EntityType.resolve(EntityType.java:412) 
at org.hibernate.type.ComponentType.resolve(ComponentType.java:607) 
at org.hibernate.type.ComponentType.nullSafeGet(ComponentType.java:298) 
at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:1121) 
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:588) 
at org.hibernate.loader.Loader.doQuery(Loader.java:724) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 
at org.hibernate.loader.Loader.loadEntity(Loader.java:1881) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:71) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:65) 
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3072) 
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:434) 
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:415) 
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:165) 
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:207) 
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:126) 
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:905) 
at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:873) 
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:590) 
at org.hibernate.type.EntityType.resolve(EntityType.java:412) 
at org.hibernate.type.ComponentType.resolve(ComponentType.java:607) 
at org.hibernate.type.ComponentType.nullSafeGet(ComponentType.java:298) 
at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:1121) 
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:588) 
at org.hibernate.loader.Loader.doQuery(Loader.java:724) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 
at org.hibernate.loader.Loader.loadEntity(Loader.java:1881) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:71) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:65) 
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3072) 
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:434) 
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:415) 
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:165) 
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:207) 
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:126) 
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:905) 
at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:873) 
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:590) 
at org.hibernate.type.EntityType.resolve(EntityType.java:412) 
at org.hibernate.type.ComponentType.resolve(ComponentType.java:607) 
at org.hibernate.type.ComponentType.nullSafeGet(ComponentType.java:298) 
at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:1121) 
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:588) 
at org.hibernate.loader.Loader.doQuery(Loader.java:724) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 
at org.hibernate.loader.Loader.loadEntity(Loader.java:1881) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:71) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:65) 
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3072) 
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:434) 
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:415) 
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:165) 
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:207) 
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:126) 
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:905) 
at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:873) 
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:590) 
at org.hibernate.type.EntityType.resolve(EntityType.java:412) 
at org.hibernate.type.ComponentType.resolve(ComponentType.java:607) 
at org.hibernate.type.ComponentType.nullSafeGet(ComponentType.java:298) 
at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:1121) 
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:588) 
at org.hibernate.loader.Loader.doQuery(Loader.java:724) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 
at org.hibernate.loader.Loader.loadEntity(Loader.java:1881) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:71) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:65) 
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3072) 
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:434) 
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:415) 
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:165) 
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:207) 
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:126) 
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:905) 
at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:873) 
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:590) 
at org.hibernate.type.EntityType.resolve(EntityType.java:412) 
at org.hibernate.type.ComponentType.resolve(ComponentType.java:607) 
at org.hibernate.type.ComponentType.nullSafeGet(ComponentType.java:298) 
at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:1121) 
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:588) 
at org.hibernate.loader.Loader.doQuery(Loader.java:724) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 
at org.hibernate.loader.Loader.loadEntity(Loader.java:1881) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:71) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:65) 
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3072) 
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:434) 
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:415) 
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:165) 
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:207) 
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:126) 
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:905) 
at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:873) 
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:590) 
at org.hibernate.type.EntityType.resolve(EntityType.java:412) 
at org.hibernate.type.ComponentType.resolve(ComponentType.java:607) 
at org.hibernate.type.ComponentType.nullSafeGet(ComponentType.java:298) 
at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:1121) 
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:588) 
at org.hibernate.loader.Loader.doQuery(Loader.java:724) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 
at org.hibernate.loader.Loader.loadEntity(Loader.java:1881) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:71) 
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:65) 
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3072) 
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:434) 
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:415) 
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:165) 
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:207) 
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:126) 
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:905) 
at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:873) 
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:590) 
at org.hibernate.type.EntityType.resolve(EntityType.java:412) 
at org.hibernate.type.ComponentType.resolve(ComponentType.java:607) 
at org.hibernate.type.ComponentType.nullSafeGet(ComponentType.java:298) 
at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:1121) 
+0

看起來你在你的對象中的一個循環引用。你可以發佈你的hibernate對象定義嗎? – THelper 2012-04-23 12:05:31

回答

0

解決方案

對我來說,解決辦法是不使用CascadeType.REFRESH(或CascadeType.ALL)任何雙向關聯。

背景

我有同樣的問題,當我在@OneToMany的父方使用cascade = CascadeType.ALL,與孩子也有@ManyToOne與此相關的父,如:

@OneToMany(mappedBy = "hospital", cascade = CascadeType.ALL) 

同樣的事情發生當我只用cascade = CascadeType.REFRESH

刷新父也刷新了孩子,這刷新了父親,這刷新了孩子......