Java-Hibernate和DB2-正确的顺序使用

Java-Hibernate和DB2-正确的顺序使用,java,sql,hibernate,db2,Java,Sql,Hibernate,Db2,我想知道如何让DB2和Hibernate序列正常工作 如有任何意见,将不胜感激。下面是我为序列创建所做的sql,带有我认为hibernate应该用于序列的注释的getStockId,以及错误 我在DB2中创建了以下序列: CREATE TABLE stock ( STOCK_ID INTEGER NOT NULL, STOCK_CODE VARCHAR(10), STOCK_NAME VARCHAR(20), PRIMARY KEY (STOCK_ID)); CREAT

我想知道如何让DB2和Hibernate序列正常工作

如有任何意见,将不胜感激。下面是我为序列创建所做的sql,带有我认为hibernate应该用于序列的注释的getStockId,以及错误

我在DB2中创建了以下序列:

  CREATE TABLE stock (
  STOCK_ID INTEGER NOT NULL,
  STOCK_CODE VARCHAR(10),
  STOCK_NAME VARCHAR(20),
  PRIMARY KEY (STOCK_ID));

  CREATE SEQUENCE seq_stock
  MINVALUE 1
  START WITH 1
  INCREMENT BY 1
  CACHE 10;
在System i中,我发出了以下命令,确保direct SQL正常运行:

   insert into PGMR28.stock(STOCK_ID, STOCK_CODE, STOCK_NAME) VALUES(NEXT VALUE FOR PGMR28.SEQ_STOCK, 'TST','Test 123');
在Hibernate Stock对象中,我执行了以下操作:

@SequenceGenerator(name="SEQ_STOCK", sequenceName="SEQ_STOCK", initialValue=1, allocationSize=1)
@Id
@Column(name = "STOCK_ID", unique = true, nullable = false)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STOCK")
public Integer getStockId() {
    return this.stockId;
}
在initialValue=1时,我也尝试了initialValue=10。错误出现在会话中。getTransaction().commit();召唤我的主要目标。我得到以下错误:

2014-03-20_08:40:07.252 WARN  o.h.util.JDBCExceptionReporter - SQL Error: -7008, SQLState: 55019
2014-03-20_08:40:07.258 ERROR o.h.util.JDBCExceptionReporter - [SQL7008] STOCK in PGMR28 not valid for operation.
Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not insert: [com.mkyong.stock.Stock]
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2454)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2874)
    at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
    at com.mkyong.App.main(App.java:37)
Caused by: java.sql.SQLException: [SQL7008] STOCK in PGMR28 not valid for operation.
    at com.ibm.as400.access.JDError.throwSQLException(JDError.java:696)
    at com.ibm.as400.access.JDError.throwSQLException(JDError.java:662)
    at com.ibm.as400.access.AS400JDBCStatement.commonExecute(AS400JDBCStatement.java:1025)
    at com.ibm.as400.access.AS400JDBCPreparedStatement.executeUpdate(AS400JDBCPreparedStatement.java:1649)
    at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:46)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2434)
    ... 11 more

发生这种情况的原因是您尝试更新的表没有被记录,并且您的更新正在非事务模式下运行

你可以试试这个

<property name="hibernate.connection.autocommit" value="true"/>


如果要将表添加到日记账,可以在@ogottwald中查找此链接,将来可以使用查找错误代码。我在日记账中添加了库存,效果很好,还删除了@SequenceGenerator注释中的以下内容:,initialValue=1,allocationSize=1。所以你给了我我需要的。非常感谢你。同样感谢您提供的SQL消息查找器。我将在将来使用它。