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

刷新父也刷新了孩子,这刷新了父亲,这刷新了孩子......