2010-01-11 6 views
1

은 내가 사용 @GeneratedValue :JPA @GeneratedValue ID에 JPA에서

public class Sear { 
    public static void main(String[] args) throws Exception { 
     EntityManagerFactory emf = Persistence.createEntityManagerFactory("testID"); 
     EntityManager em = emf.createEntityManager(); 
     Man man = new Man(); 
     man.setId(-1L); 
     try { 
      em.getTransaction().begin(); 
      em.persist(man); 
      em.getTransaction().commit(); 
     } catch (Exception e) { } 
      if(man.getId() == -1); 
     } 
    } 
} 

:

@TableGenerator(name = "idGenerator", table = "generator", pkColumnName = "Indecator" , valueColumnName = "value", pkColumnValue = "man") 
@Entity 
@Table(name="Man") 
public class Man implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "idGenerator") 
    @Column(name="ID") 
    private long id; 

    public void setId(Long i) { 
     this.id=i; 
    } 

    public Long getId(){ 
     return id; 
    } 
} 

는 I는 초기 (나중에 테스트 조건으로서 사용하는) 어떤 임의의 값에 ID를 설정 commit()을 실행 한 후 man.id의 예상 값은 얼마입니까? 그것은 (-1), 새로 생성 된 값이어야합니까, 아니면 예외가 있어야합니까?

이 체크를 사용하여 지속되는 동안 예외를 감지하려고합니다.

답변

1

자동 생성되는 필드의 값을 설정하는 것은 부적합합니다. 그것은 지정된 전략에 따라 JPA 구현에 의해 설정되어야합니다.

+0

그러나 변경 여부를 확인하기 위해이 값을 설정합니다. JPA 제공자가 새로 생성 된 값으로이 값을 대체하도록하는 구성이 있습니까? 또는 실제로이 작업을 수행하는 공급자가 있습니까?! 또는이 문제를 해결할 구성이 있습니까? eclipselink를 사용할 때 생성 된 값인 에 의해 재정의하지 않고 데이터베이스에서 -1을 유지했지만 최대 절전 모드를 사용할 때 예외가 발생했습니다. – user248230

+0

이것은 JPA 스펙에 정의되어 있지 않으므로 아무 것도 기대하지 않습니다. 구현은 그 경우에 느껴지는 것을 할 수 있습니다. 행동을 지정하지 않는 것에 대한 비난. DataNucleus를 사용하면 값을 설정하고이 경우 필드 값을 생성하지 않을 수 있습니다. – DataNucleus

+0

덕분에 많은 하지만 제발 "DataNucleus 값을 설정하고 해당 필드의 값을 생성 할 수 있습니다." 다른 공급자가 값을 설정하도록 허용하고 엔티티를 지속 할 때 새로운 값을 생성합니다. – user248230

4

commit()을 실행 한 후 man.id의 예상 값은 얼마입니까? 그것은 (-1), 새로 생성 된 값이어야합니까, 아니면 예외가 있어야합니까?

단지 하지GeneratedValue를 사용할 때 id 설정되어 당신은있다. 지속성에 대한 동작은 구현마다 다르므로이 동작에 의존하는 것은 나쁜 아이디어입니다 (휴대용이 아닙니다).

이 체크를 사용하여 지속되는 동안 예외를 감지하고 싶습니다.

JPA는 문제가 발생하면 PersistenceException (하위 클래스)을 던집니다. 문제를 처리하는 올바른 방법은이 예외를 잡는 것입니다 (이 방법은 RuntimeExeption입니다). 당신은 가난한 사람의 검사로 주장하는 경우 당신은 여전히 ​​지속 후 기본 값이있는 경우

에서, id를 할당하고 확인하지 않습니다 (귀하의 경우, 그것은 0L 될 것이다).

0

EclipseLink에서 이것은 IdValidation enum과 @PrimaryKey 주석 또는 "eclipselink.id-validation"지속성 단위 특성을 사용하여 구성 할 수 있습니다.

기본적으로 null과 0은 ID를 재생성하지만 다른 값이 사용됩니다. IdValidation을 NEGATIVE로 설정하면 음수도 대체됩니다.

또한 값을 항상 바꾸도록 Sequence 객체를 구성 할 수도 있습니다.

관련 문제