2014-03-04 74 views
0

我有兩個與ManyToOne關係(產品和所有者)的實體。問題是,當我嘗試更新產品實體時,未包含在表單中的那些字段及其所有者實體的字段將更改爲空。爲什麼更新實體會將其子字段更改爲空?

實體

@Entity 
@Table(name = "product") 
@DynamicUpdate 
public class Prodcut implements Serializable { 
    private long id; 
    private Owner owner; 
    private String code; 
    private String name; 
    .... 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "owner") 
    public Owner getOwner() { 
     return owner; 
    } 

    public void setOwner(Owner owner) { 
     this.owner = owner; 
    } 
} 

@Entity 
@Table(name = "owner") 
@DynamicUpdate 
public class Owner implements Serializable { 
    private long id; 
    .... 
} 

在這種情況下更新後的碼不被包括在該表格將被改變爲無效,和所有者的所有領域也將被改變爲空。

更新表單

<s:form method="POST" autocomplete="on" action="update"> 
       <input type="hidden" name="product.id" value="${product.id}"/> 
       <s:select name="product.owner.id" 
          id="product.owner.id" 
          label="Owner" 
          list="listOfOwners" 
          headerKey="" 
          headerValue="Owner" 
          value="%{product.owner.id}" 
          /> 
       <input type="text" name="product.name" value="${product.name}"/> 
       .... 

Hibernate代碼

final Transaction tx = session.beginTransaction(); 
      try { 

       Product product1 = (Product) session.get(Product.class,product.getId()); 
       Owner owner1 = (Owner) session.get(Owner.class, product.getOwner().getId()); 
       product.setOwner(owner1); 
       product.setCode(product1.getCode); 

       if (!tx.wasCommitted()) {  
         tx.commit(); 
       } 

       return pro; 
      } catch (Exception e) { 
       tx.rollback(); 
       e.printStackTrace(); 
      } 

我試圖從數據庫中檢索產品對象和替換未在形式提供這些字段的值,但它會遇到錯誤「具有相同標識符值的不同對象已與會話關聯」。

回答

2

最後的策略是好的。您只需MSUT不叫update()或任何其他方法:

Product persistentProduct = (Product) session.get(Product.class, product.getId()); 
persistentProduct.setName(product.getName()); 
// copy other fields 
// nothing more 
+0

感謝它的工作原理,但不存在任何其他方法來達到同樣的效果?表單中包含30個產品類的字段,如果我想將它們全部添加,我需要爲setName編寫30個單獨的行。我也可以知道什麼時候應該使用session.update? – AlexCartio1

+1

您可能可以預先填充產品作爲您的struts表單bean,而不是使用空的產品,但我不知道struts足以說明問題。但是,無論如何,如果你有30個(gasp!)字段在一個單一的形式,不得不復制30個字段是正常的。長表單意味着長碼。儘管這是不重要的代碼。 –

+0

實際上,表單用於編輯產品,我正在向表單發送預填充對象以顯示值作爲其默認值。 – AlexCartio1

相關問題