hibernate - 如何在 mysql 和 oracle 数据库中设置自动增量?

Posted

技术标签:

【中文标题】hibernate - 如何在 mysql 和 oracle 数据库中设置自动增量?【英文标题】:hibernate - how to set auto increment in both mysql and oracle databases? 【发布时间】:2015-10-11 19:16:51 【问题描述】:

我在我的 Spring MVC 项目中使用休眠和 mysql 数据库。我使用@GeneratedValue 注释在我的 id 字段上设置自动增量。所以我所有的实体都有这段代码,一切都按预期工作:

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;

public Integer getId() 
    return id;


public void setId(Integer id) 
    this.id = id;

此时,我想切换到 Oracle 数据库。现在,我有两个问题:

1. 在 oracle 中设置自增字段的最佳解决方案是什么?我使用了此代码,但无法正常工作:

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_Sequence")
@SequenceGenerator(name="id_Sequence", allocationSize=1)

2(更重要的问题)。有没有办法使用一个独特的注释来设置适用于 MySQL 和 Oracle 的自动增量

【问题讨论】:

【参考方案1】:

1: 如果您定义自己的生成器,则必须使用@GeneratedValue 中的生成器属性。如果您创建了自己的序列,则必须使用 sequenceName 定义名称,否则 hibernate 会为您创建一个。

@SequenceGenerator(name="some_gen", sequenceName="Emp_Seq")
@GeneratedValue(generator="some_gen")

2: 最灵活(且可移植)的方式是使用TABLE 策略

@GeneratedValue(strategy=GenerationType.TABLE)

或更明确

@GeneratedValue(generator="some_gen")
@TableGenerator(name="some_gen",
    table="ID_GEN",
    pkColumnName="GEN_NAME",
    valueColumnName="GEN_VAL")

这将生成(如果启用了架构生成)一个表 ID_GEN,其中包含 GEN_NAMEGEN_VALUE 列,如果架构生成不可用,您必须自己创建此表。

您可以在此处从 hibernate 文档中找到更完整的信息:http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch05.html#mapping-declaration-id-generator

【讨论】:

感谢您的回答。第一个建议不需要使用strategy=GenerationType.SEQUENCE 我不认为是因为您将生成器定义为@SequenceGenerator 我把@SequenceGenerator(name="some_gen", sequenceName="Emp_Seq") @GeneratedValue(generator="some_gen") 放在我的身份证上面,但没有用。 @GeneratedValue(strategy=GenerationType.TABLE) 也不起作用。 hibernate 是否能够在您的数据库上创建您的序列(或表),是否启用了模式生成。尝试自己创建序列并用sequenceName命名。 你是什么意思Hibernate 能够创建你的序列?我需要做什么才能使休眠能够创建序列?你能进一步解释一下吗?

以上是关于hibernate - 如何在 mysql 和 oracle 数据库中设置自动增量?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate-细细道来

hibernate 向mysql 存中文问题。。

GWT - Hibernate:如何将 MySQL 的结果显示到 GWT 客户端

如何使用hibernate grails 3,mysql?

如何在 Hibernate、MySQL 应用程序中使用 import.sql 文件将默认数据插入表中

MySQL/Hibernate - 我如何调试不断下降的 MySQL 池连接?