Here is a testcase that works in Hibernate 3.05 but fails in Hibernate 3.1 rc1 -- this looks similar to
http://opensource2.atlassian.com/projec ... se/HHH-971 which has already been confirmed.
The problem is that if you invoke Session.refresh() on the same object twice in a row, the second time a ConcurrentModificationException will occur.
Hibernate version: 3.1 rc1
Mapping documents:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!--
Document : DefaultTheme.hbm.xml
Created on : April 27, 2005, 11:43 AM
-->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="desktopbeautifier.server.database">
<class name="DefaultTheme" table="theme">
<cache usage="read-write"/>
<id name="id">
<generator class="native"/>
</id>
<version name="version"/>
<property name="name" length="50" not-null="true"/>
<property name="descendantImageCount" type="int" not-null="true"/>
<set name="children" cascade="all-delete-orphan" sort="unsorted"
inverse="true">
<cache usage="read-write"/>
<key>
<column name="parentId"/>
</key>
<one-to-many class="DefaultTheme"/>
</set>
<set name="allImages" cascade="all-delete-orphan" sort="unsorted"
inverse="true">
<cache usage="read-write"/>
<key>
<column name="themeId"/>
</key>
<one-to-many class="AbstractImage"/>
</set>
<many-to-one name="parentDirectly" class="DefaultTheme" column="parentId"/>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!--
Document : Image.hbm.xml
Created on : April 27, 2005, 4:42 PM
-->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="desktopbeautifier.server.database">
<class name="AbstractImage" table="image">
<cache usage="read-write"/>
<id name="id">
<generator class="native"/>
</id>
<discriminator column="discriminator"/>
<version name="version"/>
<many-to-one name="imageData" class="ImageData" column="dataId"
cascade="all" not-null="true"/>
<many-to-one name="dataSpecification" class="DefaultImageSpecification"
column="specificationId" cascade="save-update" not-null="true"/>
<many-to-one name="themeDirectly" class="DefaultTheme" column="themeId"
cascade="save-update" not-null="true"/>
<subclass name="DefaultOriginalImage">
</subclass>
<subclass name="DefaultCachingImage">
</subclass>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!--
Document : DefaultImageSpecification.hbm.xml
Created on : April 27, 2005, 4:33 PM
-->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="desktopbeautifier.server.database">
<class name="DefaultImageSpecification" table="image_specification">
<cache usage="read-write"/>
<id name="id">
<generator class="native"/>
</id>
<version name="version"/>
<properties name="unique" unique="true">
<property name="width" not-null="true"/>
<property name="height" not-null="true"/>
<property name="colorDepth" not-null="true"/>
</properties>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!--
Document : ImageData.hbm.xml
Created on : April 27, 2005, 4:42 PM
-->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="desktopbeautifier.server.database">
<class name="ImageData" table="image_data">
<cache usage="read-write"/>
<id name="id">
<generator class="native"/>
</id>
<version name="version"/>
<set name="images" cascade="save-update" sort="unsorted"
inverse="true">
<cache usage="read-write"/>
<key>
<column name="dataId"/>
</key>
<one-to-many class="AbstractImage"/>
</set>
<property name="data" length="2000000" not-null="true"/>
</class>
</hibernate-mapping>
Code between sessionFactory.openSession() and session.close(): Transaction transaction = session.beginTransaction();
try
{
Query getDogs = session.createQuery("from " + Theme.class.getName() +
" as theme where theme.name='Dogs'");
Theme dogs = (Theme) getDogs.uniqueResult();
System.out.println("dogs1=" + dogs);
session.refresh(dogs);
System.out.println("dogs2=" + dogs);
session.refresh(dogs);
System.out.println("dogs3=" + dogs);
}
finally
{
transaction.rollback();
}
Full stack trace of any exception that occurs:Code:
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:787)
at java.util.HashMap$KeyIterator.next(HashMap.java:823)
at org.hibernate.collection.AbstractPersistentCollection$IteratorProxy.next(AbstractPersistentCollection.java:555)
at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:290)
at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:185)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:160)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:108)
at org.hibernate.engine.Cascade.cascade(Cascade.java:248)
at org.hibernate.event.def.DefaultRefreshEventListener.onRefresh(DefaultRefreshEventListener.java:99)
at org.hibernate.event.def.DefaultRefreshEventListener.onRefresh(DefaultRefreshEventListener.java:39)
at org.hibernate.impl.SessionImpl.fireRefresh(SessionImpl.java:796)
at org.hibernate.impl.SessionImpl.refresh(SessionImpl.java:786)
at hibernate.Testcase.testIncrement(Testcase.java:58)
Name and version of the database you are using:MySQL 4.14-nt
The generated SQL (show_sql=true):Code:
Hibernate: select defaultthe0_.id as id6_, defaultthe0_.version as version6_, defaultthe0_.name as name6_, defaultthe0_.descendantImageCount as descenda4_6_, defaultthe0_.parentId as parentId6_ from theme defaultthe0_ where defaultthe0_.name='Dogs'
Hibernate: select children0_.parentId as parentId1_, children0_.id as id1_, children0_.id as id6_0_, children0_.version as version6_0_, children0_.name as name6_0_, children0_.descendantImageCount as descenda4_6_0_, children0_.parentId as parentId6_0_ from theme children0_ where children0_.parentId=?
Hibernate: select defaultthe0_.id as id6_2_, defaultthe0_.version as version6_2_, defaultthe0_.name as name6_2_, defaultthe0_.descendantImageCount as descenda4_6_2_, defaultthe0_.parentId as parentId6_2_, children1_.parentId as parentId4_, children1_.id as id4_, children1_.id as id6_0_, children1_.version as version6_0_, children1_.name as name6_0_, children1_.descendantImageCount as descenda4_6_0_, children1_.parentId as parentId6_0_, allimages2_.themeId as themeId5_, allimages2_.id as id5_, allimages2_.id as id7_1_, allimages2_.version as version7_1_, allimages2_.dataId as dataId7_1_, allimages2_.specificationId as specific5_7_1_, allimages2_.themeId as themeId7_1_, allimages2_.discriminator as discrimi2_7_1_ from theme defaultthe0_ left outer join theme children1_ on defaultthe0_.id=children1_.parentId left outer join image allimages2_ on defaultthe0_.id=allimages2_.themeId where defaultthe0_.id=?
Hibernate: select imagedata0_.id as id8_0_, imagedata0_.version as version8_0_, imagedata0_.data as data8_0_ from image_data imagedata0_ where imagedata0_.id=?
Hibernate: select imagedata0_.id as id8_0_, imagedata0_.version as version8_0_, imagedata0_.data as data8_0_ from image_data imagedata0_ where imagedata0_.id=?
Hibernate: select imagedata0_.id as id8_0_, imagedata0_.version as version8_0_, imagedata0_.data as data8_0_ from image_data imagedata0_ where imagedata0_.id=?
Hibernate: select defaultori0_.id as id7_0_, defaultori0_.version as version7_0_, defaultori0_.dataId as dataId7_0_, defaultori0_.specificationId as specific5_7_0_, defaultori0_.themeId as themeId7_0_ from image defaultori0_ where defaultori0_.id=? and defaultori0_.discriminator='desktopbeautifier.server.database.DefaultOriginalImage'