2011-06-22 75 views
0

我有2類這樣的:Hibernate映射和合並

消息(ID,標題,內容)

MessageEmployee(ID,郵件ID,僱員,readFlag)

和2表所示:

MESSAGE(mess_id,mess_title,mess_content)

MESSAGE_EMPLOYEE(mess_empl_id,mess_id,empl_id,read_fg)

映射文件:

<hibernate-mapping package="core"> 
     <class name="Message" table="MESSAGE"> 
      <!-- class id --> 
      <id name="id" type="int" column="MESS_ID" length="11"> 
       <generator class="native"/> 
      </id> 

      <property name="content" type="string" column="MESS_CONTENT" /> 
      <property name="title" type="string" column="MESS_TITLE" /> 
     </class> 
    </hibernate-mapping> 


    <hibernate-mapping package="core"> 
     <class name="MessageEmployee" table="MESSAGE_EMPLOYEE"> 
      <!-- class id --> 
      <id name="id" type="int" column="MESS_EMPL_ID" length="11"> 
       <generator class="native"/> 
      </id> 

      <!-- employee --> 
      <many-to-one name="employee" class="core.Employee" 
       column="EMPL_ID" cascade="save-update,merge" lazy="false" /> 

      <!-- message --> 
      <many-to-one name="message" class="core.Message" 
       column="MESS_ID" cascade="save-update,merge" lazy="false" /> 

      <property name="readFlag" type="character" column="READ_FG" />  
     </class> 
    </hibernate-mapping> 

這裏是我的問題: 比方說,我已經在數據庫的消息,我想創建一個messageEmployee並保存。

代碼片段:

Message sent = new Message(content, title); 
    Employee e = employeeDao.loadEmployeeWithId(Integer.valueOf(to)); 

    messageDao.merge(sent) 

    MessageEmployee m = new MessageEmployee(sent, e, null); 
    m.setReadFlag('N'); 
    messageEmployeeDao.mergeMessageEmploye(m); 

當我merge(messageEmployee),它會創建一個新的message並在數據庫中的新messageEmployee,但我不希望它來創建一個新的message

我很確定我的映射是錯誤的,因爲我不是專家,所以我可以改變以獲得我想要的行爲?

+0

嘗試在Message類的多對一映射中使用cascade =「none」。 – nIKUNJ

+0

嘗試過,但不起作用。 – l0r3nz4cc10

+0

你可以給一些代碼片段嗎? – nIKUNJ

回答

0

它將創建一個新的Message對象,因爲您不在郵件對象sent中提供id。當您執行messageDao.merge(sent)時,發送的對象不會與id合併。這是純粹的瞬態物體。嘗試從數據庫加載它像僱員。

+0

好的,謝謝!我剛添加'sent = messageDao.merge(發送);'得到一個id。 – l0r3nz4cc10