2014-11-03 2 views
0

나는이 같은 객체를 유지하고 커밋 후 :트랜잭션을 커밋 한 후 엔터티 개체에서 ID (PRIMARY KEY)를 가져 오는 방법은 무엇입니까?

 Version version = new Version(); 
     version.setVersion(getNext(this.version)); 
     version.setProjectID(projectID); 
     em.persist(version); 
     em.getTransaction().commit(); 

가이 코드 라인에 의해 ID (기본 키)를 얻으려면 :

Object id = factory.getPersistenceUnitUtil().getIdentifier(version);

내가 얻을 수있는 VersionProjectIDIDnull입니다. ID는 자동 생성되지만 여전히 null을 반환합니다. 내 엔티티 클래스에 @GeneratedValue(strategy=GenerationType.IDENTITY)을 구현하려고했지만 아무 것도 바뀌지 않았습니다. 나를위한 어떤 해결책? 더 많은 코드

버전 엔티티와

편집 : 이것이 EmbededId을 사용

@Entity 
    @NamedQuery(name="Version.findAll", query="SELECT v FROM Version v") 
    @Table(name="Version") 
    public class Version implements Serializable {  

    @EmbeddedId 
    @GeneratedValue(strategy=GenerationType.SEQUENCE) 
    private VersionPK id; 

    @Column(name="Version") 
    private String version; 

    @Column(name="ProjectID") 
    private int projectID; 

포함 가능한 클래스 : 당신은 할 수 커밋 후 flush()를 사용할 필요가

@Embeddable 
    public class VersionPK implements Serializable { 
    //default serial version id, required for serializable classes. 
    private static final long serialVersionUID = 1L; 

    @Column(name="ID") 
    private int id; 

    public VersionPK() { 
    } 
+0

정확하게 이해할 수있을지는 모르겠지만 JPA2의'@ id' 주석을 살펴보십시오. 어쩌면 그게 당신의 문제를 해결할 수 있습니다. –

+1

실제 수업이 도움이 될만한 사람들을 보여줄 수 있습니까? –

+0

엔티티 개체가 자동 생성 ID를 데이터베이스에서 가져올 수 없기 때문에 문제가 있다고 생각합니다. 'version.getId()'메소드는 항상 null을 반환하지만'version.getVersion'과'version.getProjectID'는 잘 동작합니다. – gamo

답변

0

id :

em.persist(version); 
em.getTransaction().commit(); 
em.flush(); 

은 그럼 그냥 ID를 가지고 게터를 사용

Object id = version.getId();//getId() is the getter of the id in your entity. 

See the answer here합니다.

+1

flush() 커밋 후는 무의미합니다. 왜냐하면 javadoc에 따라 트랜잭션이 활성화되어 있지 않으면 TransactionRequiredException을 던질 것이기 때문입니다. –

+0

이 경우 거래가 '무효'가 아닌지 확인하는 것이 더 안전합니다 –

+0

null과 관련이있는 항목은 무엇입니까? txn을 커밋하면 트랜잭션이 없습니다. 즉, 코드 –

관련 문제