【发布时间】:2011-04-29 05:22:14
【问题描述】:
我有一个这样的 JPA 实体:
@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 提供者。
使用merge方法的问题是因为pk是db生成的,所以如果记录已经存在(名字已经存在)那么Hibernate会尝试将它插入db,我会得到一个唯一的键约束违规异常和不做更新。有没有人有一个很好的做法来处理这个问题?谢谢!
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;
}
}
【问题讨论】:
标签: mysql jpa auto-increment