所以我已經看過有關Spring數據的JPA的各種教程,這在許多場合已經完成了不同的工作,我不確定正確的方法是什麼。如何更好地更新Spring數據中的JPA實體?
假設存在follwing實體:
package stackoverflowTest.dao;
import javax.persistence.*;
@Entity
@Table(name = "customers")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long id;
@Column(name = "name")
private String name;
public Customer(String name) {
this.name = name;
}
public Customer() {
}
public long getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
我們也有其在服務層檢索,然後交給控制器/客戶端側的DTO。
package stackoverflowTest.dto;
public class CustomerDto {
private long id;
private String name;
public CustomerDto(long id, String name) {
this.id = id;
this.name = name;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
所以現在假設客戶希望在WebUI改變了他的名字 - 然後會有一些控制器動作,哪裏就會有更新的DTO與舊的標識,新的名稱。
現在我必須將此更新的DTO保存到數據庫。
不幸目前還沒有辦法更新現有的客戶(除非不是刪除DB中的條目,並創建一個新的自動生成的ID的新Cusomter)
然而,由於這是不可行的(特別是考慮這樣的實體可能有數百個關係潛在的) - 所以來2直截了當的解決方案,我的腦海裏:
- 做二傳手在客戶類的ID - 從而允許ID的設置,然後保存客戶對象通過相應的存儲庫。
或
- id字段添加到構造,只要你想更新的客戶,您始終創建與老ID的新對象,但新價值爲其他領域(在這種情況下只有名稱)
所以我的問題是否有一個通用的規則如何做到這一點? 任何可能是什麼我解釋的兩種方法的缺點是?
「因此,目前沒有辦法更新現有客戶(除了刪除數據庫中的條目並使用新的自動生成的ID創建新的Cusomter)」[說...什麼?](http:///www.objectdb.com/java/jpa/persistence/update)。你是如何得到這個想法的? –
如果你使用相同的ID調用'save()',而你沒有重寫它,它會給你一個重複的ID異常。如果您已經正確配置了Spring事務處理,那麼無論何時從數據庫中提取客戶並簡單地設置所需的值,都可以看到有些查詢將寫入日誌中。但仍然讓我們考慮它沒有JPA,在你的情況下,通常如何用簡單的SQL更新客戶行?如果你沒有ID? – AntJavaDev
我會在一會兒添加一些分類,感謝您的意見 –