如何修改Hibernate自动生成的流水号?

3
我正在使用带有Derby数据库的Hibernate(JPA) - 我的应用服务器是Jboss 6.0。 我必须使用独立的JDBC程序预填充一个包含50000个员工信息的表。 现在,从我的应用程序中,我还需要在同一张表中即时插入新的员工信息,这时我使用JPA(因为它在应用程序容器内运行)。
我的Employee类是一个实体bean,并且具有“Id”列作为主键,其中包含“@GeneratedValue(strategy = auto)”注释,以便Hibernate确定适当的运行序列号作为主键(即Id列)。
现在的问题是,即使Employee表已经有条目,Hibernate也总是从“1”开始这个运行序列。因此,当我尝试使用Entitymanager :: persist()插入新记录时,我总是会收到违反约束的错误,例如“唯一或主键约束或唯一索引中的重复键值”。这是因为Hibernate尝试使用Id = 1插入新条目,而我已经在那个表中有一个Id = 1的条目。
我的问题是:
a)如何更新Hibernate的缓存,以便可以相应地调整“Id”列的运行序列号? 我明白它会因DB而异 - 但是否可能?
b)是否有其他方法实现相同的功能?
c)如果我编写一个独立的JPA程序来执行批量插入(即预填充),然后启动我的Jboss应用程序,Hibernate是否能够确定正确的“运行序列号”?
感谢您提前提供任何建议, - kuntal
2个回答

2

a) 如何更新Hibernate的缓存,以便根据数据库中的情况相应地调整“Id”列的运行序列号?我知道它会因数据库而异,但这有可能吗?

b) 还有其他实现此目的的方法吗?

  • @TableGenerator

您可以使用@TableGenerator生成主键,它根据维护两个字段tableName和其相应id的表中的值生成下一个id,并在插入后相应地更新它。

它负责维护正确的序列,您可以修改初始值等。

@TableGenerator(name = "TABLE_GEN", table = "ID_GEN", pkColumnName = "GEN_NAME", valueColumnName = "GEN_VAL", pkColumnValue = "PERSON_ID", initialValue = 1, allocationSize = 1)
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
private int id;

如果我编写一个独立的JPA程序来进行批量插入(即预填充),然后启动我的Jboss应用程序,Hibernate能否确定正确的“运行序列号”呢?
因此,最终创建两个生成器-1)应用程序和2)独立程序,使用共同的表格进行ID生成,这样就不会出现唯一或主键约束或唯一索引中的重复关键值。

我没有使用“initialValue”,因为我需要填充Employee表,因此initialValue应该是那里的员工条目数。因此,在我填充Employee表之后,我使用适当的计数(比如100)更新了SEQUENCE_TABLE。然后我启动了我的jboss-app,现在当我插入新记录时,id从101开始,这正是我所期望的。感谢正确的解决方案。干杯! - javauser71
顺便提一下,这里有一个类似的例子:http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing - javauser71

0

为了配置缓存,需要使用 hibernate.cfg.xml 文件。在 property 标签中的名称必须是 hibernate.cache.provider_class,以激活二级缓存。我们可以使用 hibernate.cache.use_second_level_cache 属性来激活或停用二级缓存。默认情况下,二级缓存是激活的,并使用 EHCache。

软件测试服务


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接