2012-11-04 3 views
1

EclipseLink를 사용하여 Stat라는 개체를 저장하려고합니다. ID가 db에 있으면 해당 오브젝트를 갱신하십시오. 그렇지 않은 경우 새 개체를 만듭니다. 여기 내 물건이 있습니다 :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() 호출을 제거했으며 정상적으로 작동하는 것 같습니다. –