6

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

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

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

4

1 回答 1

6

您在 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;
}

您可能需要@javax.persistence.TableGenerator [...]在所有实体中添加代码段

编辑

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

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

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

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

于 2011-02-16T11:25:01.143 回答