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]がデータベースの主キー列にマップされています。更新は許可されていません」という例外が発生することです。そして、その理由がわかりません。管理対象オブジェクトの値を問題なく更新するだけで更新するべきではありませんか?
私がやりたいこと(追加または更新)を行うための最良のイディオムは何ですか?