在使用 Hibernate 持久性提供程序的 AUTO、IDENTITY 和 TABLE(或任何其他最佳方法)中,哪种生成类型最好?

Posted

技术标签:

【中文标题】在使用 Hibernate 持久性提供程序的 AUTO、IDENTITY 和 TABLE(或任何其他最佳方法)中,哪种生成类型最好?【英文标题】:Which GenerationType is best among AUTO,IDENTITY & TABLE(or Any other best approch) using Hibernate persistence provider? 【发布时间】:2016-05-15 01:10:06 【问题描述】:

在我的项目中,我们使用的是 Oracle,我们也希望支持 mysql。 Oracle 有序列支持,但 MYSQL 没有。如果我们想在 AUTO、IDENTITY 和 TABLE(或任何其他方式)中使用 Hibernate 持久性提供程序来支持具有相同代码库的 ORACLE 和 MYSQL,哪种 GenerationType 好?谁能简要介绍一下这些?

Ex:
Class POJO
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
------
@GeneratedValue(strategy = GenerationType.IDENTITY)
-----
@GeneratedValue(strategy = GenerationType.TABLE)
------
(or Any other best approch?)

【问题讨论】:

【参考方案1】:

由于 MySQL 支持 auto_increment,因此对其相应的 POJO 使用 GenerationType.AUTO。

对于 Oracle 数据库的 POJO,您可以为每个创建一个序列并在您的 POJO 中使用它,如下所示。

序列创建

 CREATE SEQUENCE MY_SEQ
 INCREMENT BY 1
 START WITH 1
 NOMAXVALUE
 NOCYCLE
 NOCACHE;

世代类型

我想主键在您的 Oracle 表中标记为 ID。

@Id
@GeneratedValue(generator = "mySeq")
@SequenceGenerator(name = "mySeq", sequenceName = "MY_SEQ", allocationSize = 1)
@Basic(optional = false)
@NotNull
@Column(name = "ID")
private Long id;

【讨论】:

感谢您的回复,但我的问题不同,相同的代码库应该适用于两个数据库。我必须使用任何一种生成器类型。 我认为在您的情况下,由于您正在处理来自不同 RDMS 的数据,因此您不能只使用一个 GenerationType。【参考方案2】:

你可以使用

@GeneratedValue(generator = GenerationType.TABLE)

它适用于 Oracle 和 mySql

【讨论】:

感谢您回复 udit Khare,但据我所知,这会影响性能。有没有更好的办法?【参考方案3】:

您可能希望研究在 xml 配置文件中配置所有与数据库相关的内容。多年来我没有使用 xml 文件来配置 hibernate,也从未将它与注释混合使用。但我理解它的方式:您的 xml 配置将从您的 POJO 中的注释中覆盖此特定配置。

因此,您可以将 POJO 保留在特定于 oracle 的 ID 生成器中,如果您将其部署到 MySQL,则需要使用特定于 MySQL 的 ID 生成器添加 xml 配置。

不过,我不能给你任何细节。对不起。

【讨论】:

以上是关于在使用 Hibernate 持久性提供程序的 AUTO、IDENTITY 和 TABLE(或任何其他最佳方法)中,哪种生成类型最好?的主要内容,如果未能解决你的问题,请参考以下文章

关于使用hibernate注解总结

JPA 2.0 使用 Hibernate 作为提供者 - 例外:EntityManager 没有持久性提供者

Hibernate持久化类规则

Hibernate

hibernate 常识

Hibernate入门