2012-11-02 82 views
1

我的應用程序我已經使用JPA與Hibernate供應商和Oracle 11G數據庫。JPA:@SequenceGenerator不生成序列

這裏我使用的是原生查詢作爲跟隨我MST_EMP表..

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實體詳情..

@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?

原生查詢會不會引用實體中自動聲明的序列?

謝謝。

+0

1 。爲什麼你需要使用本地查詢來完成這樣一項簡單的任務? –

回答

1

JPA僅自動生成序列當通過EntityManager.persist()方法堅持一個新的對象:

例如

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

當您申請JPQL直接到DB(通過entityManager.createQuery())或原始SQL直接到數據庫(通過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

感謝您的回覆。在您的建議後,我在本地查詢中手動添加序列標識。我在本機查詢中使用SEQUENCE_NAME.nextvalue。它工作正常。 –

+0

這是最佳做法。在JPA中減少數據庫往返次數,通常使用'allocationSize'生成序列。如果您手動獲取下一個序列,您將創建大型ID窗口。 –