2012-11-04 58 views
1

我試圖使用EclipseLink保存名爲Stat的對象。如果該ID存在於數據庫中,請更新該對象。如果不是,則創建一個新對象。這是我的對象:JPA添加或更新對象

@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()說法得到異常「屬性類[用戶]的[ID]被映射到。不允許更新數據庫中的主鍵列。」我不明白爲什麼。不應刷新只是更新我的託管對象的值沒有問題?

什麼是最好的成語做我想要的(添加或更新)?

+0

你可以添加錯誤stacdump –

回答

3

JPA規範表示:

應用到實體X合併操作的語義如 如下:

  • 如果X是一個分離的實體,X的狀態被複制到相同標識的預先存在的管理實體實例X'上或者創建X的新管理副本X'。
  • 如果X是新的實體實例,則創建一個新的託管實體實例X',並將X的狀態複製到實例X'中的新託管實體 中。

[...]

所以要如果不存在添加或更新它的存在,你只需要做:

Stat attachedStat = em.merge(stat); 

關於你提到的問題,刷新,我不不知道爲什麼會發生。但是,爲什麼要刷新剛剛從數據庫加載的實體?沒有什麼可刷新的。

+0

我已經刪除了refresh()調用,它似乎工作正常。 –