我有一個JPA實體是這樣的:如果主鍵由數據庫生成,如何使用em.merge()爲jpa實體插入OR更新?
@Entity
@Table(name = "category")
public class Category implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Basic(optional = false)
@Column(name = "name")
private String name;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "category")
private Collection<ItemCategory> itemCategoryCollection;
//...
}
使用MySQL作爲底層數據庫。 「名稱」被設計爲一個獨特的關鍵。使用Hibernate作爲JPA提供程序。
使用合併方法的問題是,因爲pk是由db生成的,所以如果記錄已經存在(名稱已經存在),那麼Hibernate會嘗試將它插入到數據庫中,我將得到一個唯一的鍵約束違例異常並沒有進行更新。有沒有人有一個很好的做法來處理?謝謝!
P.S:我的解決方法是這樣的:
public void save(Category entity) {
Category existingEntity = this.find(entity.getName());
if (existingEntity == null) {
em.persist(entity);
//code to commit ...
} else {
entity.setId(existingEntity.getId());
em.merge(entity);
//code to commit ...
}
}
public Category find(String categoryName) {
try {
return (Category) getEm().createNamedQuery("Category.findByName").
setParameter("name", categoryName).getSingleResult();
} catch (NoResultException e) {
return null;
}
}
http://techblog.bozho.net/?p=266 – Bozho 2010-10-22 21:36:19