2012-03-14 67 views
1
@ManagedBean 
@SessionScoped 
public class User { 
private Person person; 
... 

user.hbm.xml休眠:一到一個插入到數據庫,而不是要更新

<hibernate-mapping> 
    <class name="entry.User" table="users"> 
     <id name="usaa"> 
      <generator class="increment"/> 
     </id> 
     <property name="username" column="username"/> 
     <property name="password" column="password"/> 
     <property name="enabled" column="enabled"/> 

     <many-to-one name="person" class="entry.Person" column="perid" not-null="true" cascade="all" unique="true"/>    
    </class> 
</hibernate-mapping> 

person.hbm.xml

<hibernate-mapping> 
    <class name="entry.Person" table="person"> 
     <id name="id" column="perid"> 
      <generator class="increment"/> 
     </id> 
     <property name="firstName" column="firstname"/> 
     <property name="lastName" column="lastname"/> 
     <property name="middleName" column="middlename"/> 
     <property name="dob" column="dob"/> 
    </class> 
</hibernate-mapping> 
相關實體

因此,上面設計的one-to-one關係。

public void createUser(User user) { 
user.setPerson(new Person()); 
getHibernateTemplate().save(user); 
.. 

User插入到數據庫,即Person插入數據庫自動also.It的確定:

正常工作DAO方法。

不料工作DAO方法:

public void editUser(User user, Person person) { 
user.setPerson(person); 
getHibernateTemplate().update(user); 
... 

問題發生了,當User與新Person數據進行更新。

生成新的人員ID和將一個新行插入到人員表中

如何做到這一點,Person適當的行要更新而不是插入?

謝謝你的幫助。

假設:

我認爲,這個問題是在自增id■當參考的實體。
看起來,在方法調用updatesaveOrUpdate的情況下應該避免自動增量。
當實體首次創建並插入數據庫時​​,應該調用自動增量。

回答

2

你的假設是正確的,

看起來,自動增量應在更新或者saveOrUpdate方法調用的情況是可以避免的。當實體首次創建並插入數據庫時​​,應該調用自動增量。

您不必wroory所有這些,Hibernate將使用一個簡單的規則要做到這一點,當對象的id爲null,則觸發一個插入查詢,如果它是觸發更新任何其他值用該值查詢

在您保存用戶之前,請將person id設置爲oldPersonId。

public void editUser(User user, Person person) { 
person.SetId(oldPersonId); 
user.setPerson(person); 
getHibernateTemplate().update(user); 

這將觸發更新查詢而不是插入。

+0

感謝您的回覆。我無法理解從哪裏得到'oldPersonId' – sergionni 2012-03-14 15:17:22

+0

ManuPK,非常感謝,我理解您的觀點,只是閱讀,您以粗體輸入))) – sergionni 2012-03-14 16:04:08