【问题标题】:How to modify Hibernate's auto-generated running serial number?如何修改Hibernate自动生成的运行序列号?
【发布时间】:2011-01-11 02:04:57
【问题描述】:

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

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

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

我的问题是

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

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

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

提前感谢您的任何建议, - 昆塔尔

【问题讨论】:

    标签: hibernate jpa jboss


    【解决方案1】:

    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 程序 进行批量插入(即 pre 人口)然后启动我的Jboss 应用程序,将休眠能够 确定正确的“连续剧” 没有?

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

    【讨论】:

    • 我没有使用“initialValue”,因为我必须填充 Employee 表,因此 initialValue 应该是那里的员工条目数。因此,在填充 Employee 表之后,我用适当的计数(比如 100)更新了 SEQUENCE_TABLE。然后我启动了我的 jboss-app,现在当我插入新记录时,id 以 101 开头,这就是我所期待的。感谢您提供正确的解决方案。干杯!
    • 顺便说一句,类似的例子在这里en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing
    【解决方案2】:

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

    软件测试服务

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      • 2023-01-24
      • 2018-07-17
      • 2012-11-21
      • 2021-12-03
      • 2012-09-20
      • 1970-01-01
      相关资源
      最近更新 更多