【问题标题】:Using sequence in MySQL and Hibernate在 MySQL 和 Hibernate 中使用序列
【发布时间】:2011-06-28 07:06:54
【问题描述】:

我正在开发一个使用 Hibernate 和 MySQL 的项目。我打算使用序列为数据库中的所有表生成 ID。 (很难描述我的问题,所以我将向您展示作为示例)。

例如:我有 2 个表 A 和 B。首先,我在表 A 中插入 10 条记录,它们的 ID 将是 1 到 10。然后,我在表 B 中插入 10 条记录,我希望 它们的 ID 是 11-20,而不是 1-10。表示生成的ID值会被数据库中所有表的所有记录统计,而不是单个表。

那么我如何在 MySQL 中使用这个概念呢?声明和语法? 在 Hibernate 中,如何使用数据模型上的策略和生成器将生成的策略应用到数据库中? 非常感谢!

【问题讨论】:

    标签: mysql hibernate sequence auto-generate


    【解决方案1】:

    Mysql 中没有序列,但是可以使用 'TABLE' id 生成

    @javax.persistence.TableGenerator(
        name="EMP_GEN",
        table="GENERATOR_TABLE",
        pkColumnName = "key",
        valueColumnName = "hi"
        pkColumnValue="EMP",
        allocationSize=20
    )
    
    @Entity
    public class Klass {
    
        @Id
        @GeneratedValue(strategy = GenerationType.TABLE, generator=EMP_GEN)
        @Column(name = "ID")
        private Long id;
    }
    

    您可能需要在所有实体中添加 sn-p @javax.persistence.TableGenerator [...]

    编辑

    非常感谢。但是我们是否有另一种方法来使用该 sn-p 而无需将其添加到每个实体中?在数据库上创建表时,如何声明 DBMS 的 ID 主键列以自动生成这样的值? – 拿破仑76

    不幸的是,我不知道这样做的优雅方式:(。在我的项目中,我们在多个实体中使用 a 序列,并且我们需要在每个类中声明序列。 您可以尝试的一件事(但我不太喜欢)是为您的所有实体创建一个超类,并且该超类仅包含 ID 字段和注释。我感觉我在一个项目中看到过这种情况,但我不是 100% 确定。

    关于告诉数据库使用该策略,我认为这不太可能。您可以尝试添加触发器并将其应用于架构中的每个表。当您在表中插入新行、从生成器表中选择一个值并将其添加到该行时,触发器将触发。老实说,我不知道这是否可行,而且我 99% 确定如果您有 2 个并发会话创建行,这将无法正常工作。

    您能否重新考虑您的策略并为 id 使用正常的自动递增列并将序号放在表的另一列中?

    【讨论】:

    • 非常感谢。但是我们是否有另一种方法来使用该 sn-p 而无需将其添加到每个实体中?在数据库上创建表时,如何声明 DBMS 的 ID 主键列以自动生成这样的值?
    • @Augusto 我也有类似的问题。你也愿意帮助我吗?这是链接:stackoverflow.com/questions/25252541/…
    • 避免使用GenerationType.TABLE,因为它需要悲观锁来生成唯一值。但是,如果您仍然想使用它,那么还可以使用一些优化技术(例如pooled)来减少额外的数据库查询。请改用GenerationType.IDENTITY
    猜你喜欢
    • 2015-06-12
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 2013-11-04
    • 2020-01-22
    • 2013-07-14
    相关资源
    最近更新 更多