Hibernate session.update插入行而不是更新行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate session.update插入行而不是更新行相关的知识,希望对你有一定的参考价值。

Event.hbm.xml事件与战斗的一对多关系

<class name="Event" table="event">
  <id name="oid" type="long" column="oid">
  <generator class="increment">
     <param name="initial_value">1</param>
  </generator>
  </id>
<property name="address">
  <column name="address"/>
</property>
<property name="date">
   <column name="date"/>   
</property>
  <list name="fights" cascade="all">  
          <key column="eventOid"></key>  
          <index column="type"></index>  
          <one-to-many class="Fight"/>  
 </list>  
</class>

检索现有事件

    public Event getEvtByDateAddress(String _date, String _address)
{
    try
    {
        if(!session.isOpen())
        {
            session = HibernateUtil.getSessionFactory().openSession();
        }
        session.beginTransaction();
        Criteria criteria = session.createCriteria(Event.class);
        criteria.add(Restrictions.eq("date", _date));
        criteria.add(Restrictions.eq("address", _address));
        Event evt = (Event)criteria.uniqueResult();
        if (evt==null)
        {
            return null;
        }
        else
        {
            return evt;
        }
    }
    catch(Exception e)
    {
        return null;
    }
}

更新被调用。

    public int updateEvent(Event _event)
{
    try
    {
        if(!session.isOpen())
        {
            session = HibernateUtil.getSessionFactory().openSession();
        }
        Event tmpEvent=new Event();
        if((tmpEvent=this.getEvtByDateAddress(_event.getDate(), _event.getAddress()))!=null)
        {
            tmpEvent.setFights(_event.getFights());
            Transaction tx =session.beginTransaction();
            session.update(tmpEvent);
            session.flush();
            tx.commit();
            session.close();
            return 0;
        }
        else
        {
            return -1;
        }
    }
    catch(Exception e){
        return -254;
    }
}

更新后,结果出乎意料。插入新记录而不是更新。

oid boxer1Oid   boxer2Oid   eventOid    type
  1         1           3         N    N
  2         2           4         N    N
  3         5           6         N    N
  4         7           8         N    N
  5         1           2          1    0
  6         3           4          1    1
  7         5           6          1    2
  8         7           8          1    3

预期结果

oid boxer1Oid   boxer2Oid   eventOid    type
  1         1           2          1     0
  2         3           4          1     1
  3         5           6          1     2
  4         7           8          1     3

我只是检索现有记录并对其进行修改,结果出乎意料。

if((tmpEvent=this.getEvtByDateAddress(_event.getDate(),_event.getAddress()))!=null)

            tmpEvent.setFights(_event.getFights());
            -------
            session.update(tmpEvent);

我错过了什么来获得预期的结果?

谢谢

答案

确保this.getEvtByDateAddress设置oid返回的实体的getFights

另外,不要创建新事件。 Event tmpEvent=new Event();可以只是Event tmpEvent = null;

以上是关于Hibernate session.update插入行而不是更新行的主要内容,如果未能解决你的问题,请参考以下文章

hibernate的update及JDBC数据库批量操作

hibernate的update及JDBC数据库批量操作

如果不在事务中,休眠 session.update 不起作用

hibernate update 只更新部分字段的3种方法(其实我只想说第二种)

Hibernate中session常用方法

hibernate一级缓存