Announcement Announcement Module
Collapse
No announcement yet.
Many-to-many bi-directional relationship Page Title Module
Move Remove Collapse
X
Conversation Detail Module
Collapse
  • Filter
  • Time
  • Show
Clear All
new posts

  • Many-to-many bi-directional relationship

    I am trying Many-to-many bi-directional relationship, but failed.

    Code:
    Event e = new Event();
    		e.setEventId(1);
    		this.getHibernateTemplate().save(e);		
    		
    		Speaker s1 = new Speaker();
    		s1.setSpeakerId(1);
    		s1.setSpeakerName("s1");
    		this.getHibernateTemplate().save(s1);		
    		
    		Speaker s2 = new Speaker();
    		s2.setSpeakerId(2);
    		s2.setSpeakerName("s2");
    		this.getHibernateTemplate().save(s2);		
    		
    		List<Speaker> list = new ArrayList<Speaker>();
    		list.add(s1);
    		list.add(s2);
    		e.setSpeakerList(list);
    		this.getHibernateTemplate().update(e);
    		
    		DetachedCriteria criteria = DetachedCriteria.forClass(Speaker.class);  
    		criteria.add(Restrictions.eq("speakerId", new Long(1)));
    		
    		List results = this.getHibernateTemplate().findByCriteria(criteria);
    		Speaker g = (Speaker)results.get(0);
    		System.out.println(g);
    
    /////////////
     <class name="data.Event" table="mts_event" >
        	<cache usage="read-write"/>    	
            <id name="eventId" column="eventId" unsaved-value="-1">
                <generator class="assigned"/>
            </id>        
            <property name="eventName"/>     	
         	<list name="speakerList" table="mts_event_speaker">
               <key column="eventId"/>
               <index column="idx"/>
               <many-to-many column="speakerId" class="data.Speaker"/>
         	</list>
        </class>
        
        <class name="data.Speaker" table="mts_speaker" >
        	<cache usage="read-write"/>    	
            <id name="speakerId" column="speakerId" unsaved-value="-1">
                <generator class="assigned"/>
            </id>        
            <property name="speakerName"/>     	
         	<list name="eventList" table="mts_event_speaker">
               <key column="speakerId"/>
               <index column="idx"/>
               <many-to-many column="eventId" class="data.Event"/>
         	</list>
        </class>
    Now the relationship data is saved into mts_event_speaker. Event and Speaker are saved.

    But I want to load Speaker g. I think g should have not-null eventList, because the relationship data is in database.

    Code:
    Hibernate: insert into mts_event_speaker (eventId, idx, speakerId) values (?, ?, ?)
    2007-07-13 14:16:03,027 DEBUG [org.hibernate.type.LongType] - binding '1' to parameter: 1
    2007-07-13 14:16:03,027 DEBUG [org.hibernate.type.IntegerType] - binding '1' to parameter: 2
    2007-07-13 14:16:03,027 DEBUG [org.hibernate.type.LongType] - binding '2' to parameter: 3
    2007-07-13 14:16:03,027 DEBUG [org.hibernate.persister.collection.AbstractCollectionPersister] - done inserting collection: 2 rows inserted
    2007-07-13 14:16:03,027 DEBUG [org.hibernate.jdbc.AbstractBatcher] - Executing batch size: 2
    2007-07-13 14:16:03,043 DEBUG [org.hibernate.jdbc.Expectations] - success of batch update unknown: 0
    2007-07-13 14:16:03,043 DEBUG [org.hibernate.jdbc.Expectations] - success of batch update unknown: 1
    2007-07-13 14:16:03,043 DEBUG [org.hibernate.jdbc.AbstractBatcher] - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
    2007-07-13 14:16:03,043 DEBUG [org.hibernate.jdbc.AbstractBatcher] - closing statement
    2007-07-13 14:16:03,043 DEBUG [org.hibernate.jdbc.ConnectionManager] - registering flush end
    2007-07-13 14:16:03,043 DEBUG [org.hibernate.event.def.AbstractFlushingEventListener] - post flush
    2007-07-13 14:16:03,058 DEBUG [org.hibernate.jdbc.AbstractBatcher] - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
    2007-07-13 14:16:03,058 DEBUG [org.hibernate.SQL] - select this_.speakerId as speakerId8_0_, this_.speakerName as speakerN2_8_0_ from mts_speaker this_ where this_.speakerId=?
    Hibernate: select this_.speakerId as speakerId8_0_, this_.speakerName as speakerN2_8_0_ from mts_speaker this_ where this_.speakerId=?
    2007-07-13 14:16:03,058 DEBUG [org.hibernate.jdbc.AbstractBatcher] - preparing statement
    2007-07-13 14:16:03,058 DEBUG [org.hibernate.type.LongType] - binding '1' to parameter: 1
    2007-07-13 14:16:03,105 DEBUG [org.hibernate.jdbc.AbstractBatcher] - about to open ResultSet (open ResultSets: 0, globally: 0)
    2007-07-13 14:16:03,105 DEBUG [org.hibernate.loader.Loader] - processing result set
    2007-07-13 14:16:03,105 DEBUG [org.hibernate.loader.Loader] - result set row: 0
    2007-07-13 14:16:03,105 DEBUG [org.hibernate.type.LongType] - returning '1' as column: speakerId8_0_
    2007-07-13 14:16:03,105 DEBUG [org.hibernate.loader.Loader] - result row: EntityKey[data.Speaker#1]
    2007-07-13 14:16:03,105 DEBUG [org.hibernate.loader.Loader] - done processing result set (1 rows)
    2007-07-13 14:16:03,105 DEBUG [org.hibernate.jdbc.AbstractBatcher] - about to close ResultSet (open ResultSets: 1, globally: 1)
    2007-07-13 14:16:03,105 DEBUG [org.hibernate.jdbc.AbstractBatcher] - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
    2007-07-13 14:16:03,105 DEBUG [org.hibernate.jdbc.AbstractBatcher] - closing statement
    2007-07-13 14:16:03,121 DEBUG [org.hibernate.loader.Loader] - total objects hydrated: 0
    2007-07-13 14:16:03,121 DEBUG [org.hibernate.engine.StatefulPersistenceContext] - initializing non-lazy collections
    2007-07-13 14:16:03,121 DEBUG [org.springframework.orm.hibernate3.HibernateTemplate] - Not closing pre-bound Hibernate Session after HibernateTemplate
    data.Speaker@dab859[speakerId=1,speakerName=s1,eventList=<null>]
    Another question, in above java coding, if I use saveOrUpdate, it doesn't work. I don't know why.

    What is your idea ?

    Thanks.
    Last edited by czy11421; Jul 13th, 2007, 02:19 PM.

  • #2
    you should ask this in Data Access section

    Comment


    • #3
      many-to-many usually gets broken down into one-to-manu and many-to-one relationship using a third table. look at hibernate docs for some example.

      You need to specify cascade attribute on the collections and then you can simple say events.saveOrUpdate() and this will save/update everything events is linked to.

      Comment


      • #4
        This has been reposted here...........
        http://forum.springframework.org/showthread.php?t=41409
        Last edited by karldmoore; Aug 29th, 2007, 11:03 AM.

        Comment

        Working...
        X