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

时间:2011-01-11 02:04:57

标签: hibernate jpa jboss

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

我的Employee类是一个Entity 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是否能够确定正确的“正在运行的串行”没有?

提前感谢任何建议, - kuntal

2 个答案:

答案 0 :(得分:2)

  

a)如何更新Hibernate'e缓存   这样我的运行序列号   “Id”列可以相应地   调整?我知道它会有所不同   从DB到DB - 但它是否可能在   所有?

     

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;
  

c)如果我写一个独立的JPA程序   做批量插入(即前   人口)然后开始我的Jboss   应用程序,将hibernate能够   确定正确的“运行序列”   没有?

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

答案 1 :(得分:0)

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

软件测试服务