Tôi có một thực thể JPA như thế này:cách sử dụng em.merge() để chèn HOẶC cập nhật cho các thực thể jpa nếu khóa chính được tạo bởi cơ sở dữ liệu?
@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;
//...
}
Sử dụng Mysql như cơ sở dữ liệu cơ bản. "name" được thiết kế như một khóa duy nhất. Sử dụng Hibernate như nhà cung cấp JPA.
Vấn đề với việc sử dụng phương pháp hợp nhất là vì pk được tạo bởi db, vì vậy nếu bản ghi đã tồn tại (tên đã có) thì Hibernate sẽ cố gắng chèn nó vào db và tôi sẽ nhận được một ngoại lệ và không thực hiện cập nhật. Có ai có thực hành tốt để xử lý điều đó không? Cảm ơn bạn!
Tái bút: Cách giải quyết của tôi là như thế này:
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