[hibernate-issues] [Hibernate-JIRA] Updated: (HHH-5833) Insertion failure of a second entity in 1-N relationship when using PROPERTY access instead of FIELD access
Cyrille Charron (JIRA)
noreply at atlassian.com
Tue Jan 11 07:46:05 EST 2011
[ http://opensource.atlassian.com/projects/hibernate/browse/HHH-5833?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Cyrille Charron updated HHH-5833:
---------------------------------
Attachment: Hibernate-bug-stdout.txt
And also a copy of the console stdout.
> Insertion failure of a second entity in 1-N relationship when using PROPERTY access instead of FIELD access
> -----------------------------------------------------------------------------------------------------------
>
> Key: HHH-5833
> URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-5833
> Project: Hibernate Core
> Issue Type: Bug
> Components: core
> Affects Versions: 3.6.1
> Environment: Windows XP, JUnit test under Eclipse with HSQLDB.
> Reporter: Cyrille Charron
> Attachments: FamilyModel.zip, Hibernate-bug-stdout.txt, Hibernate-bug.txt, HibernateTest.zip
>
>
> While testing JBossCache, i have stumbled onto an apparent bug of Hibernate,
> which throws a LazyInitializationException
> on a 1-N bi-directional relation between an entity Address
> and two entities Person.
> NB: there's no bug when using OpenJPA.
> I have copied an extract of my java code
> and the stack trace with a breakpoint on the exception
> at line 366 into AbstractPersistentCollection.java
> at the end of this issue report.
> If i am right, the bug arises because Hibernate tries to initialize
> a collection which is already in the state of initialization.
> This bug appears when i link 2 Person entities to the same Address entity
> via 1-N bi-directional relation, and if the Person's setter updates
> the 2 sides of this relation-ship by calling itself the Address's setter
> (this "helper" code in entities was to be sure
> that the relation is updated on both sides, whoever is the owner).
> In my example, this collection is the "inhabitants" attribute
> of my entity Address, in which i try to add a second entity Person,
> which has an attribute "address" pointing on the entity Address.
> Here is the "helper" code of the Person's setter :
> {code}
> public boolean setAddress(Address address) {
> boolean done = false;
> if (this.address != address) {
> if (this.address != null) this.address.remInhabitant(this);
> this.address = address;
> if (this.address != null) this.address.addInhabitant(this);
> done = true;
> }
> return done;
> }
> {code}
> My Stateless Session Bean had only to update one side of the relation :
> {code}
> @TransactionAttribute(TransactionAttributeType.REQUIRED)
> public void setAddressForPerson(int personId, int addressId) {
> Address address = findAddress(addressId);
> Person person = findPerson(personId);
> ...
> person.setAddress(address);
> }
> {code}
> In the stack trace we see that :
> we call Person.setAddress(Address) on my SECOND entity Person
> which calls PersistentSet.size() on Address's collection
> which calls PersistentSet(AbstractPersistentCollection).initialize(boolean)
> which calls TwoPhaseLoad.initializeEntity
> which calls PojoEntityTuplizer.setPropertyValues
> which calls Person.setAddress(Address) on my FIRST entity Person
> which calls PersistentSet.size() on Address's collection
> which calls PersistentSet(AbstractPersistentCollection).initialize(boolean)
> which throws the LazyInitializationException
> as if the relation between my FIRST entity Person and entity Address
> has not finished its initialization.
> This bug DISAPPEARS if i delete the "helper" code from my entity Person :
> {code}
> public boolean setAddress(Address address) {
> this.address = address;
> return true;
> }
> {code}
> and if i update manually the both sides of the relation in my Session Bean :
> {code}
> @TransactionAttribute(TransactionAttributeType.REQUIRED)
> public void setAddressForPerson(int personId, int addressId) {
> Address address = findAddress(addressId);
> Person person = findPerson(personId);
> ...
> if (person.getAddress() != null) person.getAddress().remInhabitant(person);
> if (address != null) address.addInhabitant(person);
> person.setAddress(address);
> }
> {code}
> I join 3 files :
> the model project (entities Person, Address and Family)
> the test project (Bean and JUnit)
> a resume of source code and the stack trace with some variables values.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the hibernate-issues
mailing list