保存的代码:
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    
        session.beginTransaction();        Event theEvent = new Event();
        
        theEvent.setTitle(title);        
        theEvent.setDate(theDate);
        
        EventDetail eventDetail = new EventDetail();
        eventDetail.setDetail("11");
        Set eventDetailSet = new HashSet();
        eventDetailSet.add(eventDetail);
        eventDetail = new EventDetail();
        eventDetail.setDetail("22");
        eventDetailSet.add(eventDetail);
        
        theEvent.setEventDetailSet(eventDetailSet);        session.save(theEvent);        session.getTransaction().commit();
        session.close();
是单向关联的,那应该怎么设置呢?

解决方案 »

  1.   

    嗯,我刚才试着把EventDetail中的event_id字段设置为可空就可以了。原来hibernate是先把EventDetail中的event_id放入null,然后再update..Hibernate: select EVENTS_NUM.nextval from dual
    Hibernate: select EVENTS_DETAIL_NUM.nextval from dual
    Hibernate: select EVENTS_DETAIL_NUM.nextval from dual
    Hibernate: insert into EVENTS (EVENT_DATE, title, EVENT_ID) values (?, ?, ?)
    Hibernate: insert into EVENTS_DETAIL (detail, event_id, ID) values (?, ?, ?)
    Hibernate: insert into EVENTS_DETAIL (detail, event_id, ID) values (?, ?, ?)
    Hibernate: update EVENTS_DETAIL set EVENT_ID=? where ID=?
    Hibernate: update EVENTS_DETAIL set EVENT_ID=? where ID=?----如果设置双向关联是不是就能直接把主表的主键直接insert进去呢
      

  2.   

    eventDetail的event_id不需要设置啊,那是HIBERNATE自己插入的
    你上面的执行的语句应该很多多余的,双向关联你在EventDetail的mapping文件加上
    <many-to-one name="event"  cascade="save-update" column="EVENT_ID" not-null="true" class="events.Event"/>
    再执行你的保存代码看看怎么执行的
      

  3.   

    这个错误就是告诉你有EVENTS_DETAIL表的EVENT_ID字段不能为空,而你插入的空值
    <set name="eventDetailSet" inverse="false" lazy="false" cascade="all">
         <key column="EVENT_ID"/>
         <one-to-many class="events.EventDetail"/>
    </set>
    把 inverse设为true若inverse为false
    则在insert的时候,先插入一条记录,外键的值是NULL
    再执行第二条语句更新语句, 把外键给关联上去
      

  4.   

    恩,主要是inverse你设成了false要不然不会再UPDATE的
      

  5.   

    上面的不要乱讲,如果你在set中的外键不设置not-null="true"它会分两次操作,先插入多方,再更新多方的外键列,设置了不空就变成一次操作了,直接插入赋有外键值的多方,改成如下:
            <set name="eventDetailSet" inverse="false" lazy="false" cascade="all">
            <key column="EVENT_ID" not-null="true"/>
            <one-to-many class="events.EventDetail"/>
            </set>