@GeneratedValue(strategy=GenerationType.TABLE)
告诉JPA提供者在将新创建的实体插入数据库时使用表来获取ID。
当使用Hibernate作为提供者时,这会产生一个表hibernate_sequences
,它有两列:实体名称和已经分配给该实体的最大身份。在这里,看起来Hibernate没有成功从您的实体获取下一个ID,但很难说明原因,因为您没有提供足够的信息。
那么,您能否提供完整的堆栈跟踪?此外,请将hibernate.show_sql
属性设置为true
,并设置正确的日志级别log4j.logger.org.hibernate.SQL=DEBUG
。如果可能的话,加入日志到你的问题。
也许只是检查您是否为Oracle配置了正确的hibernate.dialect
。实际上,如果可能的话,加入你的休眠配置。 PS:使用Oracle生成PK的“传统”方法是使用序列(您可以让Hibernate使用GenerationType.AUTO
或使用SEQUENCE
强制使用SEQUENCE
来推测您的数据库类型的最佳策略),但我会假设您需要结果数据结构是数据库不可知的。如果没有,我会建议去替代序列。
编辑:回答评论从OP约GenerationType.AUTO
。事实上,默认值是一个叫做hibernate_sequence
的单一全局序列,这可能是一个问题。但是,如下所示的设置,您可以使用GenerationType.AUTO
,仍然控制的情况下,序列的名称,其中数据库采用序列:
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_entity_seq_gen")
@SequenceGenerator(name="my_entity_seq_gen", sequenceName="MY_ENTITY_SEQ")
private long id;
换句话说,你可以使用使用不同的序列名称为每个表没有失去可移植性。
如果我把GenerationType.Auto,它将使用全局增量数,意味着我所有的实体将增加相同的数字。代码运行正常,但它会用完增量数字吗? – cometta 2009-11-30 04:53:54
@Pascal:如果我们提供了一个SequenceGenerator,它是否有助于将Startegy指定为AUTO? – Nrj 2009-11-30 05:36:51
@Nrj实际上,如果你使用'AUTO'并且数据库使用序列,'@ SequenceGenerator'将有助于控制序列的名称。但是,如果数据库不存在,它将被“忽略”(例如使用HSQLDB)。所以,与'SEQUENCE'不同,这是可移植的。 – 2009-11-30 05:49:52