-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 
Author Message
 Post subject: Lazy Inverse Map Bug?
PostPosted: Wed Mar 14, 2007 2:10 pm 
Newbie

Joined: Thu Feb 08, 2007 9:46 am
Posts: 4
Hibernate version: 3.2.1

Mapping documents:
Code:
<hibernate-mapping>
    <class name="scratchpad.hibernate.A">
        <id name="id">
            <generator class="assigned"/>
        </id>
        <map name="bs" cascade="all-delete-orphan" inverse="true">
            <key column="aId"/>
            <map-key type="long" column="cId"/>
            <one-to-many class="scratchpad.hibernate.B"/>
        </map>
    </class>
    <class name="scratchpad.hibernate.B">
        <id name="id">
            <generator class="assigned"/>
        </id>
        <many-to-one name="a" class="scratchpad.hibernate.A" column="aId"/>
        <many-to-one name="c" class="scratchpad.hibernate.C" column="cId" not-null="true"/>
    </class>
   
    <class name="scratchpad.hibernate.C">
        <id name="id">
            <generator class="assigned"/>
        </id>
    </class>
</hibernate-mapping>


Code between sessionFactory.openSession() and session.close():
Code:
        long aId = 1l;
        long bId = 2l;
        long cId = 3l;

        SessionFactory factory = new Configuration().configure()
                .buildSessionFactory();
        try {
            Session s = factory.openSession();
            try {
                Transaction tx = s.beginTransaction();
                try {
                    C c = new C(cId);
                    s.save(c);

                    A a = new A(aId);
                    B b = new B(bId);
                    b.setC(c);
                    b.setA(a);
                    a.getBs().put(cId, b);

                    s.save(a);
                    tx.commit();
                } catch (Exception e) {
                    try {
                        tx.rollback();
                    } catch (Exception e2) {
                        // do nothing
                    }

                    throw e;
                }
            } finally {
                s.close();
            }

            s = factory.openSession();
            try {
                Transaction tx = s.beginTransaction();
                try {
                    A a = (A) s.load(A.class, aId);
                    a.getBs().remove(cId);
                   
                    tx.commit();
                } catch (Exception e) {
                    try {
                        tx.rollback();
                    } catch (Exception e2) {
                        // do nothing
                    }

                    throw e;
                }
            } finally {
                s.close();
            }
        } finally {
            factory.close();
        }


Name and version of the database you are using: MySQL 5.0.33

The generated SQL (show_sql=true):
Code:
Hibernate: select b_.id, b_.aId as aId1_, b_.cId as cId1_ from B b_ where b_.id=?
Hibernate: insert into C (id) values (?)
Hibernate: insert into A (id) values (?)
Hibernate: insert into B (aId, cId, id) values (?, ?, ?)
Hibernate: select a0_.id as id0_0_ from A a0_ where a0_.id=?
Hibernate: select bs0_.aId as aId1_, bs0_.id as id1_, bs0_.cId as cId1_, bs0_.id as id1_0_, bs0_.aId as aId1_0_, bs0_.cId as cId1_0_ from B bs0_ where bs0_.aId=?


Hi,

I've been having a confusing problem shown above, whereby A has a Map of Bs indexed using the id from an association with C. This Map is inversely mapped for A and with 'Cascade Delete Orphan'. In the second opened session above, where B is removed from A's Map and thus orphaned, B will not be deleted. I have observed B is only deleted if I either set 'lazy="false"' for A's Map or make an interaction with A's Map in the code (before B's removal) like 'a.getBs().get(cId)'. I suspect the lazy intializer is not initializing correctly in the above scenario.

The above scenario does not happen if A's Map is not inversely mapped but B's many-to-one with A is.

Can somebody shed some light on whether this is me using Hibernate incorrectly or is a bug?

Thanks


Top
 Profile  
 
 Post subject:
PostPosted: Fri Mar 16, 2007 6:33 am 
Newbie

Joined: Thu Feb 08, 2007 9:46 am
Posts: 4
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2498


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.