JPA:@SequenceGenerator未生成序列
我在我的应用程序中使用了JPA与Hibernate供应商和Oracle 11G DB 这里我在我的MST_EMP表上使用本机查询,如下所示JPA:@SequenceGenerator未生成序列,jpa,nativequery,Jpa,Nativequery,我在我的应用程序中使用了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.setParamete
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_代码赋值。因为序列与它相关联
但是这个查询给了我这样的错误
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_代码吗
本机查询是否会引用实体中自动声明的序列
谢谢。JPA仅在您通过
EntityManager.persist()
方法持久化新对象时自动生成序列:
例如
当您将JPQL直接应用于DB(通过entityManager.createQuery()
)或原始SQL直接应用于DB(通过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往返,通常使用
allocationSize
s生成序列。如果手动获取下一个序列,则将创建大id窗口。1。对于这样一项琐碎的任务,您为什么需要求助于本机查询?
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();