Both BookmarkTest and WeblogCategoryTest assigns id to a temporary
entity created to test equality. Hibernate correctly complains about two
persistent instances (root and testFolder/Cat) having same Id. I think
assigning Id is artificial and is wrong. Attached patch fixes it.
Sorry for the mix up :(. All the tests definitely pass against hibernate
with the patch.
Regards,
Mitesh
Dave wrote:
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
Index: tests/org/apache/roller/business/BookmarkTest.java
===================================================================
--- tests/org/apache/roller/business/BookmarkTest.java (revision 493201)
+++ tests/org/apache/roller/business/BookmarkTest.java (working copy)
@@ -242,7 +242,6 @@
assertTrue(root.equals(testFolder));
testFolder = new FolderData(root, "root", "root", testWeblog);
- testFolder.setId(root.getId());
assertFalse(root.equals(testFolder));
}
Index: tests/org/apache/roller/business/WeblogCategoryTest.java
===================================================================
--- tests/org/apache/roller/business/WeblogCategoryTest.java (revision
493201)
+++ tests/org/apache/roller/business/WeblogCategoryTest.java (working copy)
@@ -178,7 +178,6 @@
assertTrue(root.equals(testCat));
testCat = new WeblogCategoryData(testWeblog, root, "root", "root",
null);
- testCat.setId(root.getId());
assertFalse(root.equals(testCat));
}