#914 ✓resolved

Patched hibernate 3.6.1 causes save()-related bug

Reported by John | June 15th, 2011 @ 11:58 PM | in 1.2.5 (closed)

Framework version: 1.2.1
Platform you're using: Windows 7 x64, JDK 1.6.0_26 x64

Reproduction steps:
@Entity public class AnEntity extends Model
{ public List children; }

@Entity public class AnotherEntity extends Model
{ public String prop; }

public class Blah
{ public void blah() {

     AnEntity e1 = new AnEntity().save();
     e1.children = new ArrayList<AnotherEntity>();

     //this save will cause collectionEntry for e1.children to be deleted in hibernate for reasons explained below
     new AnotherEntity().save();

    e1.save(); //PersistenceException occured : org.hibernate.HibernateException: Found two representations of same collection

} }


In patched AbstractFlushingEventListener.java: flushCollections only recreates a CollectionEntry if isDocreate() == true, and if the collection is owned by an entity with willBeSaved==true.

Also in AbstractFlushingEventListener, postFlush() removes all collections for whom getLoadedPersister() == null because it assumes they are dereferenced

When saving AnotherEntity, play does not re-create e1.children because e1 is not the entity being saved. However, if not re-creating e1.children (with CollectionRecreateAction) has the side effect of making getLoadedPersister() == null, which in turn has the side effect of having hibernate remove collection from StatefulPersistenceContext.collectionEntries;

When FlushVisitor.processCollection() runs after second save of AnotherEntity. It calls Collections.processReachableCollection(), which cannot find the children collection in collectionEntries and throws exception:

CollectionEntry ce = session.getPersistenceContext().getCollectionEntry(collection);

    if ( ce == null ) {
        // refer to comment in StatefulPersistenceContext.addCollection()
        throw new HibernateException(
                "Found two representations of same collection: " +

Comments and changes to this ticket

Please Sign in or create a free account to add a new ticket.

With your very own profile, you can contribute to projects, track your activity, watch tickets, receive and update tickets through your email and much more.

New-ticket Create new ticket

Create your profile

Help contribute to this project by taking a few moments to create your personal profile. Create your profile »

<h2>Play framework</h2>

Play makes it easier to build Web applications with Java. It is a clean alternative to bloated Enterprise Java stacks. It focuses on developer productivity and targets RESTful architectures. Learn more on the <a href="http://www.playframework.org">http://www.playframework.org</a> website.<br><br>

<h2>Source code is hosted on github</h2>Check out our repository at <a href="http://github.com/playframework/play">http://github.com/playframework/play</a><br><br>

<h2>Contributing, creating a patch</h2> Please read the <a href="http://play.lighthouseapp.com/projects/57987/contributor-guide">contributor guide</a><br><br>

<h2>Reporting Security Vulnerabilities</h2> Since all bug reports are public, please report any security vulnerability directly to <em>guillaume dot bort at gmail dot com</em>.<br><br>

<h2>Creating a bug report</h2> Bug reports are incredibly helpful, so take time to report bugs and request features in our ticket tracker. We’re always grateful for patches to Play’s code. Indeed, bug reports with attached patches will get fixed far quickly than those without any.<br><br>

Please include as much relevant information as possible including the exact framework version you're using and a code snippet that reproduces the problem.<br><br>

Don't have too much expectations. Unless the bug is really a serious "everything is broken" thing, you're creating a ticket to start a discussion. Having a patch (or a branch on Github we can pull from) is better, but then again we'll only pull high quality branches that make sense to be in the core of Play.

Referenced by