【问题标题】:JPA : @SequenceGenerator is not generating the sequenceJPA:@SequenceGenerator 没有生成序列
【发布时间】:2012-10-22 18:25:53
【问题描述】:

我的应用程序已将 JPA 与 Hibernate 供应商和 Oracle 11G DB 一起使用。

这里我在我的 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 吗?

会原生查询,不引用Entity中自动声明的序列吗?

谢谢。

【问题讨论】:

  • 1.为什么需要借助原生查询来完成如此琐碎的任务?

标签: jpa nativequery


【解决方案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 直接应用到数据库(通过 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();

【讨论】:

  • 感谢您的回复。根据您的建议,我将在本机查询中手动添加序列 ID。我在本机查询中使用 SEQUENCE_NAME.nextvalue。它工作正常。
  • 这是最佳实践。在 JPA 中,为了减少 DB 往返,通常使用allocationSizes 生成序列。如果您手动获取下一个序列,您将创建大的 id 窗口。
猜你喜欢
  • 1970-01-01
  • 2019-08-28
  • 2013-12-27
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 2021-08-11
相关资源
最近更新 更多