使用Spring批处理的Hibernate - 在插入查询后选择scope_identity()

时间:2013-08-05 14:02:13

标签: spring hibernate db2 spring-batch datapersistance

我有一个包含以下字段的VO -

HD_REC_ID
REC_TYP_CD
SRC_SYS_NM
SRC_TYP_CD
RCV_SYS_CD
JOB_STTS_CD
IDX_FILE_NM
IDX_FILE_LOC_TXT
XTRCT_DT
XTRCT_TM
DTL_REC_CNT
ATCH_CNT
ERR_MSG_TXT
PROC_MODE_CD
INVLD_HD_REC_TXT
CRT_TS

使用的注释是 -

@Id
@Column(name = EntityConstants.HD_REC_ID)
@GeneratedValue(strategy = GenerationType.AUTO)
private int headerId;

@Generated(value = GenerationTime.INSERT)
@Column(name = EntityConstants.CRT_TS)
@Temporal(TemporalType.TIMESTAMP)
private Date creationTime;

其中,第一个和最后一个字段(HD_REC_ID和CRT_TS)是自动生成的。 将值插入DB时,这是我在控制台(编辑控制台)上获得的。

[8/5/13 15:22:12:666 IST] 00000063 SystemOut     O Hibernate: insert into T_HD_REC (ATCH_CNT, ERR_MSG_TXT, XTRCT_DT, XTRCT_TM, IDX_FILE_LOC_TXT, IDX_FILE_NM, INVLD_HD_REC_TXT, JOB_STTS_CD, PROC_MODE_CD, DTL_REC_CNT, REC_TYP_CD, RCV_SYS_CD, SRC_SYS_NM, SRC_TYP_CD) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) select scope_identity()
[8/5/13 15:22:13:046 IST] 00000063 SystemOut     O (JDBCExceptionReporter.java:100) 2013-08-05 15:22:13,045 -- WARN -- SQL Error: -199, SQLState: 42601
[8/5/13 15:22:13:047 IST] 00000063 SystemOut     O (JDBCExceptionReporter.java:101) 2013-08-05 15:22:13,046 -- ERROR -- DB2 SQL error: SQLCODE: -199, SQLSTATE: 42601, SQLERRMC: SELECT;;FOR <END-OF-STATEMENT> NOT ATOMIC
[8/5/13 15:22:13:047 IST] 00000063 SystemOut     O (JDBCExceptionReporter.java:100) 2013-08-05 15:22:13,047 -- WARN -- SQL Error: -516, SQLState: 26501
[8/5/13 15:22:13:048 IST] 00000063 SystemOut     O (JDBCExceptionReporter.java:101) 2013-08-05 15:22:13,047 -- ERROR -- DB2 SQL error: SQLCODE: -516, SQLSTATE: 26501, SQLERRMC: null
[8/5/13 15:22:13:048 IST] 00000063 SystemOut     O (JDBCExceptionReporter.java:100) 2013-08-05 15:22:13,048 -- WARN -- SQL Error: -518, SQLState: 07003
[8/5/13 15:22:13:049 IST] 00000063 SystemOut     O (JDBCExceptionReporter.java:101) 2013-08-05 15:22:13,048 -- ERROR -- DB2 SQL error: SQLCODE: -518, SQLSTATE: 07003, SQLERRMC: null


com.ibm.db2.jcc.b.SqlException: DB2 SQL error: SQLCODE: -199, SQLSTATE: 42601, SQLERRMC: SELECT;;FOR <END-OF-STATEMENT> NOT ATOMIC

在此处阅读有关SQL错误代码的信息 - http://pic.dhe.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=%2Fcom.ibm.db2z9.doc.codes%2Fsrc%2Ftpc%2Fn199.htm

-518
THE EXECUTE STATEMENT DOES NOT IDENTIFY A VALID PREPARED STATEMENT
-516
THE DESCRIBE STATEMENT DOES NOT SPECIFY A PREPARED STATEMENT
-199
ILLEGAL USE OF KEYWORD keyword. TOKEN token-list WAS EXPECTED

据我所知,这是因为附加了stmt select scope_identity()而没有前面的分号。但我不是在任何地方都这样称呼它。 当我将在SQL服务器上创建的POC移动到DB2 9上的DBA创建的数据库时,会发生此错误。这在SQL服务器上运行良好。当应用程序在SQL服务器上时,插入stmt日志后没有附加select scope_identity()

我对Hibernate和Spring(Batch)都很陌生。对不起,如果这对你来说听起来很傻......但令人惊讶的是,我在网上找不到任何类型的东西...... 我查看了这个链接并了解了身份。 What is the difference between Scope_Identity(), Identity(), @@Identity, and Ident_Current?

任何帮助都将不胜感激......谢谢!

1 个答案:

答案 0 :(得分:0)

您是否将方言从SQLServerDialect更改为DBDialectselect scope_identity()来自SQLServerDialect.appendIdentitySelectToInsert()