如何修改Hibernate';自动生成的运行序列号?

如何修改Hibernate';自动生成的运行序列号?,hibernate,jpa,jboss,Hibernate,Jpa,Jboss,我正在使用Hibernate(JPA)和Derby数据库-我的应用服务器是Jboss 6.0。 我必须用50000个员工信息预先填充一个表,为此我使用了一个独立的JDBC程序。 现在,从我的应用程序中,我还需要在同一个表中动态插入新的员工信息,当时我使用的是JPA(因为它在应用程序容器中运行) 我的Employee类是一个实体bean,它的“Id”列是主键,带有“@GeneratedValue(strategy=auto)”注释,以便Hibernate为主键(即Id列)计算出适当的运行序列号 现

我正在使用Hibernate(JPA)和Derby数据库-我的应用服务器是Jboss 6.0。 我必须用50000个员工信息预先填充一个表,为此我使用了一个独立的JDBC程序。 现在,从我的应用程序中,我还需要在同一个表中动态插入新的员工信息,当时我使用的是JPA(因为它在应用程序容器中运行)

我的Employee类是一个实体bean,它的“Id”列是主键,带有“@GeneratedValue(strategy=auto)”注释,以便Hibernate为主键(即Id列)计算出适当的运行序列号

现在的问题是Hibernate总是从“1”开始运行这个序列,即使Employee表已经有条目。因此,从应用程序中,当我尝试使用Entitymanager::persist()插入新记录时,我总是会遇到约束冲突错误,如“在唯一或主键约束或唯一索引中重复键值”。 这是因为hibernate尝试插入Id=1的新条目,因为我在该表中已经有Id=1的条目

我的问题是

a) 如何更新Hibernate'e缓存,以便可以相应地调整“Id”列的运行序列号? 我知道每一分贝的音量都会有所不同,但有可能吗

b) 有没有其他方法可以达到同样的效果

c) 如果我编写一个独立的JPA程序来执行批量插入(即预填充),然后启动Jboss应用程序,hibernate能否确定正确的“running serial”否

提前感谢您的建议,
-kuntal

用于配置缓存,使用hibernate.cfg.xml文件。属性标记中的名称必须是hibernate.cache.provider\u类才能激活二级缓存。我们可以使用hibernate.cache.use_second_level_cache属性,它允许您激活和停用二级缓存。默认情况下,二级缓存被激活并使用EHCache

软件测试服务

a) 如何更新Hibernate'e缓存 因此,我的运行序列号为 “Id”列可以相应地设置 调整?我知道情况会有所不同 从一个数据库到另一个数据库-但在 全部

b) 还有其他方法可以实现吗 同样的

  • @表格生成器
您可以使用@TableGenerator生成主键,它根据维护的表中的值生成下一个id,该表有两个字段tableName及其各自的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;
c) 如果我写一个独立的JPA程序 进行批量插入(即预插入 然后启动我的Jboss 应用程序,hibernate是否能够 确定正确的“运行序列号” 没有

因此,最后,为-1)应用程序和2)独立程序创建两个生成器,使用公共表生成id,这样在唯一或主键约束或唯一索引中就不会有重复的键值。

我没有使用“initialValue”因为我必须填充Employee表,因此initialValue应该是那里的Employee条目计数。因此,在填充Employee表之后,我用适当的计数(比如100)更新了SEQUENCE_表。然后我启动了我的jboss应用程序,现在当我插入新记录时,id以101开始,这就是我所期望的。谢谢你的正确解决方案。干杯顺便说一句,这里有类似的例子