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();
}
我試圖從數據庫中檢索產品對象和替換未在形式提供這些字段的值,但它會遇到錯誤「具有相同標識符值的不同對象已與會話關聯」。
感謝它的工作原理,但不存在任何其他方法來達到同樣的效果?表單中包含30個產品類的字段,如果我想將它們全部添加,我需要爲setName編寫30個單獨的行。我也可以知道什麼時候應該使用session.update? – AlexCartio1
您可能可以預先填充產品作爲您的struts表單bean,而不是使用空的產品,但我不知道struts足以說明問題。但是,無論如何,如果你有30個(gasp!)字段在一個單一的形式,不得不復制30個字段是正常的。長表單意味着長碼。儘管這是不重要的代碼。 –
實際上,表單用於編輯產品,我正在向表單發送預填充對象以顯示值作爲其默認值。 – AlexCartio1