2011-06-23 44 views
3

如何更新复合键我有8列C1,C2,C3,C4,C5,C6,C7,C8,其中的{C1,C2,C3}组合是一个表一个复合键。在休眠

我想更新只有C2的数据,但是当我尝试更新它的显示异常

org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1 
at org.hibernate.jdbc.BatchingBatcher.checkRowCount(BatchingBatcher.java:93) 
at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:79) 
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58) 
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195) 
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:230) 
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:141) 
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296) 
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) 
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1007) 

是否有可能在Hibernate来更新这个?

我使用的代码 -

public static synchronized Session getSession() { 

    Session mysession = (Session) DAO.session.get(); 
    if (mysession == null||!mysession.isOpen()) { 
     mysession = sessionFactory.openSession(); 
     DAO.session.set(mysession); 
    } 

    return mysession; 
} 

protected void begin() { 
     try{ 

    getSession().beginTransaction(); 

     }catch(Exception ex) 
     { 
      LOGGER.error(ex); 
     } 
} public void update(Facebook facebookdata){ begin(); 
     getSession().update(facebookdata); 
     commit(); 

}

+0

无法更新关系数据库中的主键列。也许你可以使用代理键? –

回答

1

从你的描述,我看到你试图更新主键。您能否发布您用于更新的代码?

此外,你可能想看看这个post

+2

+1关系数据库不允许更新主键列。无论您是否使用Hibernate都没关系。 –

2

因为这是Hibernate使用检索对象更新后,您将无法更新主键。这就是为什么自从Hibernate期望拥有相同主键的对象之后,你会得到过时的异常。

所以基本上你必须改变你的主键到其他东西像增加数字或克隆对象保存它,然后删除旧的不正确的对象。