我正在尝试使用 EclipseLink 保存一个名为 Stat 的对象。如果 id 存在于数据库中,则更新该对象。如果没有,请创建一个新对象。这是我的对象:
@Entity
public class Stat {
@Column
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public long id;
@JoinColumn
@ManyToOne
public User user;
@Column
public boolean accepted;
@Column
public boolean finished;
public Stat() {
}
}
这是我添加/更新对象的方法。
public long addReplaceStat(Stat stat) {
em.getTransaction().begin();
Stat oldStat = em.find(Stat.class, stat.id);
if (oldStat == null)
em.persist(stat);
else
em.merge(stat);
em.getTransaction().commit();
em.getTransaction().begin();
Stat newStat = em.find(Stat.class, stat.id);
if (newStat != null)
em.refresh(newStat);
em.getTransaction().commit();
return stat.id;
}
我的问题是我在 em.refresh() 处遇到异常,说“类 [User] 的属性 [id] 已映射到数据库中的主键列。不允许更新。” 我不明白为什么。不应该刷新只是更新我的托管对象的值而没有问题吗?
做我想做的事(添加或更新)的最佳习语是什么?