当前位置: 首页 > 面试题库 >

在MySQL和Hibernate中使用序列

谭卜鹰
2023-03-14
问题内容

我正在使用Hibernate和MySQL的项目中。我打算使用序列来为数据库中的所有表生成ID。(很难描述我的问题,因此我将向您举例说明)。

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

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


问题答案:

您在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主键列以自动生成类似的值?–
napoleonit76

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

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

您是否可以重新考虑策略,并使用常规的自动递增列作为ID,并将序列号放在表的另一列中?



 类似资料:
  • 我使用的是Hibernate Framework3.6.10、Final和MySQL。我得到了 线程“main”org.hibernate.mappingException中的异常:无法将标识列键生成用于:org.koushik.javabrains.dto.vehicle的映射 当am在vehicle类中包含时。它在这个注释中工作得很好。 是我的基类: : SLF4J:未能加载类“org.slf

  • 我使用JPA/Hibernate和postgres作为我的数据库 我在postgres中创建了这样一个序列: 我希望Hibernate使用上面的序列作为主键。 实体的id部分为: 当我创建一个新播放器并试图通过方法我得到以下错误: Hibernate:从更新组织的播放器序列中选择下一个值作为id值。冬眠增强型。表结构$1$1执行错误:无法读取高值组织。postgresql。util。异常“下一列”

  • 问题内容: 我需要在Hibernate中使用带有变量的本地SQL查询。 但是hibernate抛出错误信息:参数前缀后不允许有空格 因此,与:= mysql变量分配和hibernate变量分配存在冲突。 这是我的SQL查询: hibernate代码(jpa语法): 我无法使用存储过程,因为我的SQL查询是动态生成的(“ Level”可以是“ int”或“ force” …) 我怎样才能做到这一点

  • 我们有一个使用Hibernate作为OR映射器的java项目。我们需要该项目与Oracle和MySQL一起工作。因为有些客户不想安装Oracle。我们已经在实体上添加了@SequenceGenerator注释以获得序列。但是项目不能用这些注释连接到Mysql数据库管理系统。有没有什么方法可以在mysql和Oracle模式下都有序列,而不做任何更改?

  • 运行时收到此错误。

  • 是否可以使用Hibernate ORM和OGM创建单个应用程序?我创建了一个应用程序,我在一个应用程序中遇到了多个JPA的问题。我通过更改两个JPA的名称解决了这个问题,但两个JPA之间仍然存在冲突。以下是例外情况: 原因:org.springframework.beans.factory.无法将类型[org.hibernate.internal.SessionFactoryImpl]的参数值转换