本帖最后由 salana 于 2010-05-20 16:26:55 编辑

解决方案 »

  1.   

     <set name="eventdate"  inverse="false" 改成inverse=true试试
      

  2.   

    改成true时,往eventinfo表中add一条记录时, eventdate表中的eventid列无数据,请高手帮我看看
      

  3.   

    你是想级联保存吧  我觉得你应该保存它的子类级联保存父类 保存Eventdate试试
    <many-to-one name="eventinfo"  class="com.palmcity.model.Eventinfo" cascade="save-update" >
                <column name="EVENTID" length="36" />
    <set name="eventdate"   lazy="false">
                <key>
                    <column name="EVENTID" length="36" not-null="true"/>
                </key>
                <one-to-many class="com.palmcity.model.Eventdate" />
            </set>
      

  4.   

    照你的方式作了for (int i=0;i<moreeventinfo.getStarttimes().size();i++) {
    infodate.setDateid(Long.valueOf(moreeventinfo.getDateids().get(i)));
    infodate.setEnddate(moreeventinfo.getEnddate());

    infodate.setEventinfo(info);
    getHibernateTemplate().update(infodate);}
    可还是更新第二条数据时eventid列仍是没有数据
      

  5.   

      getHibernateTemplate().update(infodate);}改成 getHibernateTemplate().save(infodate);
      

  6.   

    <many-to-one name="eventinfo" class="com.palmcity.model.Eventinfo" cascade="save-update" >再加上 lazy=false别忘了
      

  7.   

    gagucheng 好样的
    salana加油
      

  8.   

    路过,好久没搞过hibernate了,都有不记得了,你这里有N+1,但多的一方没有数据,你看一下你那个多的一方是否配置正确,好像没有关联到啊,也就是说你这里只是单方面的一对多,多的那一方没有关联到主的那一方
      

  9.   

    我把它照这样子作了,数据库中还是第二条记录开始eventid就没有数据
      

  10.   

    谢谢楼上各位朋友的支持,我解决了,原因是我在作级联的时候出错了
    在eventdate.java中要加入eventinfoprivate Eventinfo eventinfo;在eventinfo.java中加入eventdateprivate Set eventdate = new HashSet(0);在中间处理层应先循环把 set eventdate都填进去eventinfo也填进去.
    再执行update.但是我现在又出现了 update TRAFFICS.EVENTDATE set EVENTID=null where EVENTID=?我不知道 hibernate为什么一定要把 EVENTID=null
      

  11.   

    我执行的时候hibernate 先insert一条sql语句Hibernate: select SEQUENCES_EVENTDATEID.nextval from dual
    Hibernate: insert into TRAFFICS.EVENTDATE (STARTTIME, ENDTIME, STARTDATE, ENDDATE, UPDATEDATETIME, EWEEK, UNKNOWDATE, EVENTID, DATEID) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
      

  12.   

    http://wind-bell.javaeye.com/blog/25090
    看看这个网站吧
    如果其他没问题 而hibernate 帮你改了主键的话 你的主键生成策略是序列的话 你先看看你的序列吧
      

  13.   

     <set name="eventdate"  inverse="false"  cascade="all" lazy="false">
                <key>
                    <column name="EVENTID" length="36" not-null="true"/>
                </key>
                <one-to-many class="com.palmcity.model.Eventdate" />
            </set>
    inverse一定要用true
    这样操作后,你的保存是用update的吗?
      

  14.   

    我把我的代码贴上来看看
    public void saveAuditEventInfo(EventInfoVo moreeventinfo) {
    // TODO Auto-generated method stub
    Eventinfo info = new Eventinfo();
    info.setEventid(moreeventinfo.getEventid());
    info.setCitycode(moreeventinfo.getCitycode());
    info.setType(moreeventinfo.getType());
    info.setTitle(moreeventinfo.getTitle());
    info.setEventstype(moreeventinfo.getEventstype());
    info.setContent(moreeventinfo.getContent());
    info.setStuation(moreeventinfo.getSituation());
    info.setSourceaddress(moreeventinfo.getSituation());
    info.setShorttitle(moreeventinfo.getShorttitle());
    info.setDeletelabel(new BigDecimal(1));
    info.setEventsource(moreeventinfo.getEventsource());
    info.setAudittype(moreeventinfo.getAudittype());
    info.setIscritical(moreeventinfo.getIscritical());
    info.setReceivetype(moreeventinfo.getReceivetype());
    info.setHarmonychar(moreeventinfo.getHarmonychar());
    info.setAuditdate(new Date());
    info.setAuditopinion(moreeventinfo.getAuditopinion());
    info.setAudituserid(moreeventinfo.getAudituserid());
    info.setUserid(moreeventinfo.getUserid());
    info.setPid(moreeventinfo.getPid());
    Set dates = new HashSet();
    Eventdate infodate = new Eventdate();
    for (int i=0;i<moreeventinfo.getStarttimes().size();i++) {
    infodate.setEnddate(moreeventinfo.getEnddate());
    infodate.setStartdate(moreeventinfo.getStartdate());
    if (moreeventinfo.getEweek() == null
    || moreeventinfo.getEweek().equals("")) {
    infodate.setEweek("WA");
    } else {
    infodate.setEweek(moreeventinfo.getEweek());
    }
    infodate.setUpdatedatetime(new Date());
    infodate.setStarttime(moreeventinfo.getStarttimes().get(i));
    infodate.setEndtime(moreeventinfo.getEndtimes().get(i));
    infodate.setEventid(new BigDecimal(moreeventinfo.getEventid()));
    infodate.setEventinfo(info);
    dates.add(infodate);
    }
    info.setEventdate(dates);


    Set dates2 = new HashSet();
    Eventdate infodate2 = new Eventdate();
    for (int i=0;i<moreeventinfo.getStarttimes().size();i++) {
    infodate2.setDateid(Long.valueOf(moreeventinfo.getDateids().get(i)));
    infodate2.setEnddate(moreeventinfo.getEnddate());
    infodate2.setStartdate(moreeventinfo.getStartdate());
    if (moreeventinfo.getEweek() == null
    || moreeventinfo.getEweek().equals("")) {
    infodate2.setEweek("WA");
    } else {
    infodate2.setEweek(moreeventinfo.getEweek());
    }
    infodate2.setUpdatedatetime(new Date());
    infodate2.setStarttime(moreeventinfo.getStarttimes().get(i));
    infodate2.setEndtime(moreeventinfo.getEndtimes().get(i));
    infodate2.setEventid(new BigDecimal(moreeventinfo.getEventid()));
    infodate2.setEventinfo(info);                        getHibernateTemplate().update(infodate2) } }
      

  15.   

    各位高手,我解决了,原因是hibernate 在更新级联表时,应先按照如下顺序执行.
    利用for循环先按照子表id从数据库子表中查出,数据存在子表映射类对象中,再把页面中关于子表更新的字段,逐一存到所查出的子表映射类对象里,再把这些类存到主表映射类对象(Set eventdate = new HashSet(0));中,再从数据库中利用主表id查出主表,并再生成一个主表类对象,再getHibernateTemplate().update(info);就可以了.
    其中,从数据库中利用映射类查询该对象是这样的:getHibernateTemplate().get(class, id);