The changes for "Relationships need to be maintained from both sides" in FolderData and WeblogCategoryData cause the unit tests to fail. Perhaps you tested against the JPA backend but not against Hibernate?
Do we need to change the way that we specify the Hibernate cascades for the relationships in question? Any other ideas? Details below... - Dave On 1/2/07, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:
Author: clr Date: Tue Jan 2 18:21:13 2007 New Revision: 492013 URL: http://svn.apache.org/viewvc?view=rev&rev=492013 Log: Manage relationships on both sides Modified: incubator/roller/trunk/src/org/apache/roller/pojos/FolderData.java incubator/roller/trunk/src/org/apache/roller/pojos/WeblogCategoryData.java incubator/roller/trunk/tests/org/apache/roller/business/PingsTest.java Modified: incubator/roller/trunk/src/org/apache/roller/pojos/FolderData.java URL: http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/pojos/FolderData.java?view=diff&rev=492013&r1=492012&r2=492013 ============================================================================== --- incubator/roller/trunk/src/org/apache/roller/pojos/FolderData.java (original) +++ incubator/roller/trunk/src/org/apache/roller/pojos/FolderData.java Tue Jan 2 18:21:13 2007 @@ -84,6 +84,16 @@ } else { this.path = parent.getPath() + "/" + name; } + + this.parentFolder = parent; + // Relationships need to be maintained from both sides + if(parent != null) { + // The following triggers this.hashCode(), which is calculated + // based on this.path + // It needs to happen after this.path is initialized + parent.childFolders.add(this); + } + }
That change causes the test teardown to fail for the testFolderEquality test when testing using Hibernate. The following exception is thrown: java.lang.Exception: Test teardown failed at org.apache.roller.business.BookmarkTest.tearDown(BookmarkTest.java:86)Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [org.apache.roller.pojos.FolderData#402881e40ff7f5a6010ff7f5b68e00c6] at org.hibernate.engine.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:629) at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:70) at org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:790) at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:782) at org.hibernate.engine.CascadingAction$2.cascade(CascadingAction.java:47) at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:213) at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:157) at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:108) 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.engine.Cascade.cascade(Cascade.java:223) at org.hibernate.event.def.DefaultDeleteEventListener.cascadeBeforeDelete(DefaultDeleteEventListener.java:220) at org.hibernate.event.def.DefaultDeleteEventListener.deleteEntity(DefaultDeleteEventListener.java:169) at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:110) at org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:790) at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:768) at sun.reflect.GeneratedMethodAccessor28.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301) at $Proxy0.delete(Unknown Source) at org.apache.roller.business.hibernate.HibernatePersistenceStrategy.remove(HibernatePersistenceStrategy.java:373) at org.apache.roller.business.hibernate.HibernateUserManagerImpl.removeWebsiteContents(HibernateUserManagerImpl.java:197) at org.apache.roller.business.hibernate.HibernateUserManagerImpl.removeWebsite(HibernateUserManagerImpl.java:100) at org.apache.roller.TestUtils.teardownWeblog(TestUtils.java:160) at org.apache.roller.business.BookmarkTest.tearDown(BookmarkTest.java:81) ... 12 more And this change:
Modified: incubator/roller/trunk/src/org/apache/roller/pojos/WeblogCategoryData.java URL: http://svn.apache.org/viewvc/incubator/roller/trunk/src/org/apache/roller/pojos/WeblogCategoryData.java?view=diff&rev=492013&r1=492012&r2=492013 ============================================================================== --- incubator/roller/trunk/src/org/apache/roller/pojos/WeblogCategoryData.java (original) +++ incubator/roller/trunk/src/org/apache/roller/pojos/WeblogCategoryData.java Tue Jan 2 18:21:13 2007 @@ -71,8 +71,7 @@ this.image = image; this.website = website; - this.parentCategory = parent; - + // calculate path if(parent == null) { this.path = "/"; @@ -81,6 +80,16 @@ } else { this.path = parent.getPath() + "/" + name; } + + this.parentCategory = parent; + // Relationship needs to be maintained from both sides + if(parent != null) { + // Following triggers this.hashCode(), which is calculated + // based on this.path + // It needs to happen after this.path is initialized + parent.childCategories.add(this); + } + }
It causes the same thing for testWeblogCategoryEquality: java.lang.Exception: Test teardown failed at org.apache.roller.business.WeblogCategoryTest.tearDown(WeblogCategoryTest.java:84)Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [org.apache.roller.pojos.WeblogCategoryData#402881e40ff80284010ff8029aec011e] at org.hibernate.engine.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:629) at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:70) at org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:790) at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:782) at org.hibernate.engine.CascadingAction$2.cascade(CascadingAction.java:47) at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:213) at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:157) at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:108) 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.engine.Cascade.cascade(Cascade.java:223) at org.hibernate.event.def.DefaultDeleteEventListener.cascadeBeforeDelete(DefaultDeleteEventListener.java:220) at org.hibernate.event.def.DefaultDeleteEventListener.deleteEntity(DefaultDeleteEventListener.java:169) at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:110) at org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:790) at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:768) at sun.reflect.GeneratedMethodAccessor54.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301) at $Proxy0.delete(Unknown Source) at org.apache.roller.business.hibernate.HibernatePersistenceStrategy.remove(HibernatePersistenceStrategy.java:373) at org.apache.roller.business.hibernate.HibernateUserManagerImpl.removeWebsiteContents(HibernateUserManagerImpl.java:211) at org.apache.roller.business.hibernate.HibernateUserManagerImpl.removeWebsite(HibernateUserManagerImpl.java:100) at org.apache.roller.TestUtils.teardownWeblog(TestUtils.java:160) at org.apache.roller.business.WeblogCategoryTest.tearDown(WeblogCategoryTest.java:79) ... 12 more
