2012-11-02 3 views
1

I 내 ​​응용 프로그램 JPA를 Hibernate 공급 업체 및 Oracle 11G DB와 함께 사용했습니다. 여기 JPA : @ SequenceGenerator가 시퀀스를 생성하지 않습니다.

Query query = this.entityManager.createNativeQuery("INSERT INTO MST_EMP emp (" + 
        "EMP_NAME,EMP_MAIL_ID) VALUES ('dasdas',?)"); 
      query.setParameter(1,"dhrumil"); 
      query.executeUpdate();   

내 MST_EMP 엔티티의 세부 사항입니다 내 MST_EMP 테이블에 다음과 같이 네이티브 쿼리를 사용하고 여기에

.. .. 내 이해 당으로

@Table(name = "MST_EMP") 
public class MstEmp implements Serializable, IsEntity { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name = "EMP_CODE") 
    @SequenceGenerator(name = "EMP_CODE_SEQ", sequenceName = "EMP_CODE_SEQ") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "EMP_CODE_SEQ") 
    private String empCode; 


    @Column(name="EMP_MAIL_ID") 
    private String empMailId; 


    @Column(name="EMP_NAME") 
    private String empName; 

    public MstEmp() { 
    } 

    public String getEmpCode() { 
     return this.empCode; 
    } 

    public void setEmpCode(String empCode) { 
     this.empCode = empCode; 
    } 

    public String getCreatedBy() { 
     return this.createdBy; 
    } 


    public void setEmpMailId(String empMailId) { 
     this.empMailId = empMailId; 
    } 



    public String getEmpName() { 
     return this.empName; 
    } 

    public void setEmpName(String empName) { 
     this.empName = empName; 
    } 

} 

, 우리에게 필요 없어요 네이티브 쿼리에서 EMP_CODE 값을 제공하십시오. 시퀀스가 연관되어 있기 때문입니다.

그러나이 쿼리는 다음과 같이 나에게 오류를 제공 ..

SEVERE: ORA-01400: cannot insert NULL into ("PERK"."MST_EMP"."EMP_CODE") 

SEVERE: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute native bulk manipulation query 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1179) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1112) 

이 하나가 말해 줄 수, 우리는 기본 쿼리에서 EMP_CODE를 제공해야합니까?

원시 쿼리는 엔터티에 자동으로 선언 된 시퀀스를 참조하지 않습니까?

감사합니다.

일예 : 당신이 EntityManager.persist() 방법을 통해 새로운 객체를 계속 될 경우

+0

1 왜 그런 간단한 작업을 위해 네이티브 질의에 의존해야합니까? –

답변

1

JPA는 자동 시퀀스를 생성

EntityManager em = \\ ... Initialise 
MstEmp newMstEmp = new MstEmp(); 
newMstEmp.setEmpCode(...); 
newMstEmp.setEmpMailId(...); 
newMstEmp.setEmpName(...); 
EntityTransaction tx = em.getTransaction(); 
tx.begin(); 
em.persist(newMstEmp); 
tx.commit(); 

직접 직접 DB에 (entityManager.createQuery()를 통해) DB 또는 원시 SQL에 JPQL을 적용 할 때 (entityManager.createNativeQuery()를 통해 - 당신이 여기처럼), 당신이 당신의 자신의 시퀀스를 삽입해야합니다 :

Query query = this.entityManager.createNativeQuery("INSERT INTO MST_EMP emp (" + 
        "EMP_CODE,EMP_NAME,EMP_MAIL_ID) VALUES (EMP_CODE_SEQ.nextval,'dasdas',?)"); 
query.setParameter(1,"dhrumil"); 
query.executeUpdate(); 
+0

답장을 보내 주셔서 감사합니다. 귀하의 제안 후, 원시 ID에 수동으로 시퀀스 ID를 추가하려고합니다. 네이티브 쿼리에서 SEQUENCE_NAME.nextvalue를 사용하고 있습니다. 그것은 잘 작동합니다. –

+0

그것은 최선의 방법입니다. JPA에서 DB 라운드 트립을 줄이기 위해 일반적으로 시퀀스는'allocationSize's로 생성됩니다. 수동으로 다음 순서를 얻으면 큰 ID 창을 만듭니다. –

관련 문제