我一直在使用jboss 4.2.3的hibernate,一切正常,现在我将代码迁移到Jboss 7.1.1并突然开始得到:
Caused by: org.hibernate.exception.ConstraintViolationException: ORA-00001: unique constraint (OBLICORE.PK_ACE_WORKERS_QUEUE_STATS_ID) violated
生成的ID也是负数。
失败的实体定义如下:
@Id
@SequenceGenerator(name = "SEQ_ACE_WORKERS_QUEUE_STATS_ID", sequenceName = "SEQ_ACE_WORKERS_QUEUE_STATS_ID", allocationSize = 500)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_ACE_WORKERS_QUEUE_STATS_ID")
@Column(name = "ID")
private long Id;
我检查了Oracle中的序列,它似乎是O.K(就像我说的,它之前使用的是jboss 4.2,并且自迁移以来在数据库方面没有任何变化)。
我尝试编写Hibernate查询日志,但无法找到该查询,我还记录了持久化该类的特定调用,并发现它只被调用一次。
答案 0 :(得分:8)
请检查此问题:hibernate oracle sequence produces large gap
它必须是Hibernate的序列生成器,它默认为Hi / Lo算法,返回值溢出。您可以尝试使用特定于休眠的注释来默认使用旧行为GenericGenerator(name="blah", strategy="sequence")
,或设置allocationSize=1
。
如果您依赖的序列递增大于1的某个值,则必须使用不同的生成器。或者将hibernate.id.new_generator_mappings
设置为false
就足够了,但这也是新问题的范围。
答案 1 :(得分:1)
当我们更改Hibernate以使用新生成器时,我使用以下脚本来修复序列:
DECLARE
v NUMBER;
BEGIN
FOR r IN (select sequence_name from user_sequences) LOOP
EXECUTE IMMEDIATE 'ALTER SEQUENCE '|| r.sequence_name ||' INCREMENT BY 50';
EXECUTE IMMEDIATE 'SELECT '|| r.sequence_name ||' .NEXTVAL FROM DUAL' INTO v;
END LOOP;
END;
/
如果您的allocationSize为500,则应将“INCREMENT BY 50”更改为“INCREMENT BY 500”。
答案 2 :(得分:0)
如果生成的id值在您的项目中不那么重要,请尝试使用@GeneratedValue(strategy = GenerationType.AUTO)
此策略将通过最后一个递增来自动生成id。希望它对你有用。