java Hibernate @Id @GeneratedValue 注释无法识别 DB2 数据库生成的增量 ID
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5315787/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Hibernate @Id @GeneratedValue annotation doesn't recognise increment ID generated by DB2 Database
提问by Dawud
Inserting a second record using Hibernate 3 into DB2 v9.x where a column has a Unique primary key column Id generated by DB2 doesn't work with persisting my Hibernate entity.
使用 Hibernate 3 将第二条记录插入到 DB2 v9.x 中,其中一列具有由 DB2 生成的唯一主键列 Id 不适用于持久化我的 Hibernate 实体。
Inserting the first record works fine, however unless I manually increment and set the value using the setter no more records can be persisted. I have tried commenting out @GeneratedValue....am I using this correctly? I do not want Hibernate to auto increment the Id column, I want it to use the incremented ID generated by DB2 itself to insert the next row. Thanks:)
插入第一条记录工作正常,但是除非我手动增加并使用 setter 设置值,否则无法保留更多记录。我试过注释掉@GeneratedValue....我正确使用了吗?我不希望 Hibernate 自动增加 Id 列,我希望它使用 DB2 本身生成的增加的 ID 来插入下一行。谢谢:)
This is my code:
这是我的代码:
private short APLSEQNUM;
@javax.persistence.Column(name = "MRT_APLSEQNUM")
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public short getAPLSEQNUM() {
return APLSEQNUM;
}
The contrainst added in DB2 create table script to generate the Id:
DB2 创建表脚本中添加的约束来生成 Id:
"MRT_APLSEQNUM" SMALLINT NOT NULL GENERATED BY DEFAULT AS IDENTITY ( START WITH +1
INCREMENT BY +1
MINVALUE +1
MAXVALUE +32767
NO CYCLE
CACHE 20
NO ORDER )
This is the exception:
这是例外:
Hibernate: insert into RPS.TMRT (MRT_APRNUM, MRT_CHKLOC, MRT_DPTCDE, MRT_FUNCDE, MRT_MDCNUM, MRT_MDCRSLCDE, MRT_MDCRSLDTE, MRT_OCCCDE, MRT_QIDNO, MRT_REGDTE, MRT_REMARK, MRT_SECCDE, MRT_SMP, MRT_USRID, MRT_VISNUM, MRT_APLYER, MRT_APLSEQNUM, MRT_ACMPNUM) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 15-Mar-2011 17:37:44 org.hibernate.util.JDBCExceptionReporter logExceptions WARNING: SQL Error: -803, SQLState: 23505 15-Mar-2011 17:37:44 org.hibernate.util.JDBCExceptionReporter logExceptions SEVERE: DB2 SQL error: SQLCODE: -803, SQLSTATE: 23505, SQLERRMC: 1;RPS.TMRT 15-Mar-2011 17:37:44 org.hibernate.event.def.AbstractFlushingEventListener performExecutions SEVERE: Could not synchronize database state with session org.hibernate.exception.ConstraintViolationException: could not insert: [qa.gov.moi.rps.db.entity.Medical_MRT] at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2272) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2665) at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:60) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000) at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338) at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106) at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54) at qa.gov.moi.rps.db.helper.MedicalHelper.create(MedicalHelper.java:74) at qa.gov.moi.rps.db.helper.MedicalHelper.main(MedicalHelper.java:285) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:115) Caused by: com.ibm.db2.jcc.c.SqlException: DB2 SQL error: SQLCODE: -803, SQLSTATE: 23505, SQLERRMC: 1;RPS.TMRT at com.ibm.db2.jcc.c.fg.d(fg.java:1340) at com.ibm.db2.jcc.b.gb.k(gb.java:351) at com.ibm.db2.jcc.b.gb.a(gb.java:60) at com.ibm.db2.jcc.b.w.a(w.java:52) at com.ibm.db2.jcc.b.wb.c(wb.java:213) at com.ibm.db2.jcc.c.gg.ab(gg.java:1779) at com.ibm.db2.jcc.c.gg.d(gg.java:2324) at com.ibm.db2.jcc.c.gg.W(gg.java:457) at com.ibm.db2.jcc.c.gg.executeUpdate(gg.java:440) at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2252) ... 18 more javax.persistence.RollbackException: Error while commiting the transaction at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:71) at qa.gov.moi.rps.db.helper.MedicalHelper.create(MedicalHelper.java:74) at qa.gov.moi.rps.db.helper.MedicalHelper.main(MedicalHelper.java:285) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:115) Caused by: org.hibernate.exception.ConstraintViolationException: could not insert: [qa.gov.moi.rps.db.entity.Medical_MRT] at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2272) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2665) at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:60) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000) at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338) at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106) at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54) ... 7 more Caused by: com.ibm.db2.jcc.c.SqlException: DB2 SQL error: SQLCODE: -803, SQLSTATE: 23505, SQLERRMC: 1;RPS.TMRT at com.ibm.db2.jcc.c.fg.d(fg.java:1340) at com.ibm.db2.jcc.b.gb.k(gb.java:351) at com.ibm.db2.jcc.b.gb.a(gb.java:60) at com.ibm.db2.jcc.b.w.a(w.java:52) at com.ibm.db2.jcc.b.wb.c(wb.java:213) at com.ibm.db2.jcc.c.gg.ab(gg.java:1779) at com.ibm.db2.jcc.c.gg.d(gg.java:2324) at com.ibm.db2.jcc.c.gg.W(gg.java:457) at com.ibm.db2.jcc.c.gg.executeUpdate(gg.java:440) at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2252) ... 18 more
Hibernate: 插入 RPS.TMRT (MRT_APRNUM, MRT_CHKLOC, MRT_DPTCDE, MRT_FUNCDE, MRT_MDCNUM, MRT_MDCRSLCDE, MRT_MDCRSLDTE, MRT_OCCCDE, MRT_QIDNO, MRT_REGDTE, MRT_REMARK, MRT_NUMER, MRT_NUMER, MRT_NUMER_NUMER, MRT_NUMERID_MRT_SECRDEMARK,MRT_SECRDEMARK,MRT_SECRSC ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 15-Mar-2011 17:37:44 org.hibernate.util.JDBCExceptionReporter logExceptions警告:SQL 错误:-803,SQLState:23505 15-Mar-2011 17:37:44 org.hibernate.util.JDBCExceptionReporter logExceptions 严重:DB2 SQL 错误:SQLCODE:-803,SQLSTATE:23505,SQLERRMC:1;RPS。 TMRT 2011 年 3 月 15 日 17:37:44 org.hibernate.event.def.AbstractFlushingEventListener performExecutions 严重:无法与会话 org.hibernate.exception.ConstraintViolationException 同步数据库状态:无法插入:[qa.gov.moi.rps .db. 实体。Medical_MRT] 在 org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71) 在 org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 在 org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister) .java:2272) 在 org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2665) 在 org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:60) 在 org.hibernate.engine.ActionQueue。在 org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263) 在 org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167) 在 org.hibernate.event.def 执行(ActionQueue.java:279) .AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298) 在 org.hibernate。event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000) at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338) at org .hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106) at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54) at qa.gov.moi.rps.db.helper.MedicalHelper.create(MedicalHelper) .java:74) at qa.gov.moi.rps.db.helper.MedicalHelper.main(MedicalHelper.java:285) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl) .java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com。intellij.rt.execution.application.AppMain.main(AppMain.java:115) 引起:com.ibm.db2.jcc.c.SqlException:DB2 SQL 错误:SQLCODE:-803,SQLSTATE:23505,SQLERRMC:1; RPS.TMRT 在 com.ibm.db2.jcc.c.fg.d(fg.java:1340) 在 com.ibm.db2.jcc.b.gb.k(gb.java:351) 在 com.ibm。 db2.jcc.b.gb.a(gb.java:60) 在 com.ibm.db2.jcc.bwa(w.java:52) 在 com.ibm.db2.jcc.b.wb.c(wb. java:213) 在 com.ibm.db2.jcc.c.gg.ab(gg.java:1779) 在 com.ibm.db2.jcc.c.gg.d(gg.java:2324) 在 com.ibm .db2.jcc.c.gg.W(gg.java:457) 在 com.ibm.db2.jcc.c.gg.executeUpdate(gg.java:440) 在 org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher .java:23) 在 org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2252) ... 18 更多 javax.persistence.RollbackException:在 org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:71) at qa.gov.moi.rps.db.helper.MedicalHelper.create(MedicalHelper.java:74) at qa.gov 提交事务时出错。 moi.rps.db.helper.MedicalHelper.main(MedicalHelper.java:285) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect。 DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:115) 引起: org.hibernate.exception.ConstraintViolationException: 无法插入: [qa.gov.moi.rps.db.entity.Medical_MRT] 在 org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71) 在 org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 在 org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2272) 在 org.hibernate.persister.entity.AbstractEntityPersister .insert(AbstractEntityPersister.java:2665) at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:60) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279) at org.hibernate.engine。 ActionQueue.executeActions(ActionQueue.java:263) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298) at org.hibernate .event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) 在 org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000) 在 org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338) 在 org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java) :106) 在 org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54) ... 7 导致:com.ibm.db2.jcc.c.SqlException:DB2 SQL 错误:SQLCODE:-803,SQLSTATE : 23505, SQLERRMC: 1; RPS.TMRT at com.ibm.db2.jcc.c.fg.d(fg.java:1340) at com.ibm.db2.jcc.b.gb.k(gb.java: 351) 在 com.ibm.db2.jcc.b.gb.a(gb.java:60) 在 com.ibm.db2.jcc.bwa(w.java:52) 在 com.ibm.db2.jcc.b .wb.c(wb.java:213) 在 com.ibm.db2.jcc.c.gg.ab(gg.java:1779) 在 com.ibm.db2.jcc.c.gg.d(gg.java :2324) 在 com.ibm.db2.jcc.c.gg.W(gg.java:457) 在 com.ibm.db2.jcc.c.gg.executeUpdate(gg.java:440) 在 org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23) 在 org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2252) ... 18 更多
回答by Piotr Gwiazda
Use @GeneratedValue(strategy = GenerationType.IDENTITY)
利用 @GeneratedValue(strategy = GenerationType.IDENTITY)
回答by Pat B
here's what we did :
这是我们所做的:
we created a sequence in DB2 :
我们在 DB2 中创建了一个序列:
in the hibernate mapping file :
在休眠映射文件中:
<id name="idClass" column="IDROW" >
<generator class="sequence">
<param name="sequence">SIDFINANCEMENT</param>
</generator>
</id>
Works in a clustered environment where many instances need to get a sequence and the sequence generated is unique.
在集群环境中工作,其中许多实例需要获取序列并且生成的序列是唯一的。