利用 JPA 和 Hibernate 的长处之一是它提供了数据库特定方言和成果抽象。 因此,理论上,您可以实现一个应用措施,将其毗连到一个受支持的数据库,而且它可以在不消变动任何代码的环境下运行。
Hibernate 真的很好。 但诚恳说,您没有想过您的应用措施能与每个支持的数据库完美运行,是吗?
Hibernate 处理惩罚最重要的工作。 可是,劳务派遣管理系统,假如您但愿应用可以或许运行精采,您仍然需要知道要利用哪种数据库,并相应地调解设置和代码。
在之前的一篇文章中,我接头了“假如你想利用 Hibernate 和 PostgreSQL 数据库你需要知道的 6 件工作”。本日我想仔细看看 MySQL 数据库。
1、映射:主键
处理惩罚和建设主键很基本,但也是应用措施最重要的一部门。
JPA 类型的 @GeneratedValue 注解答允您界说用于建设独一主键值的计策。您可以选择 SEQUENCE、IDENTITY、TABLE 和 AUTO。
一般来说,我发起利用 SEQUENCE 计策,软件开发,因为它答允 Hibernate 利用 JDBC 批处理惩罚和其他需要延迟执行 SQL INSERT 语句的优化计策。
然而,您不能将此计策与 MySQL 数据库一起利用。因为它需要一个数据库序列,刚好 MySQL 不支持此成果。
因此,您需要在 IDENTITY 和 TABLE 之间举办选择。思量到 TABLE 计策的机能和可扩展性问题,这很容易作出抉择。
假如您正在利用 MySQL 数据库,则应始终利用 GenerationType.IDENTITY。它利用自动增量(autoincremented )的数据库列,这是最有效的可用要领。您可以通过利用 @GeneratedValue(strategy = GenerationType.IDENTITY) 注解主键属性来执行此操纵。
@Entity public class Author { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", updatable = false, nullable = false) private Long id; ... }
2、映射:Hibernate 5 中 GenerationType.AUTO 问题
当您利用 GenerationType.AUTO 时,劳务派遣管理系统,Hibernate 会按照 Hibernate 方言选择生成计策。假如您需要支持大都据库,以下一种常见的要领。
@Entity public class Author { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id", updatable = false, nullable = false) private Long id; ... }
在旧版本中,Hibernate 为 MySQL 数据库选择 GenerationType.IDENTITY。 这是一个不错的选择。如之前所述,这是最有效的要领。
不幸的是此行为在 Hibernate 5 中产生了改变。此刻是选择 GenerationType.TABLE,它利用数据库表来生成主键。 这种要领需要大量数据库查询和灰心锁来生成独一值。
14:35:50,959 DEBUG [org.hibernate.SQL] - select next_val as id_val from hibernate_sequence for update 14:35:50,976 DEBUG [org.hibernate.SQL] - update hibernate_sequence set next_val= ? where next_val=? 14:35:51,097 DEBUG [org.hibernate.SQL] - insert into Author (firstName, lastName, version, id) values (?, ?, ?, ?)
您可以通过界说一个 @GenericGenerator 来制止这一点,以下代码汇报 Hibernate 利用当地计策生成主键值。
@Entity public class Author { @Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "native") @GenericGenerator(name = "native", strategy = "native") @Column(name = "id", updatable = false, nullable = false) private Long id; ... }
然后,Hibernate 将利用 MySQL 自动增量数据库列生成主键值。
14:41:34,255 DEBUG [org.hibernate.SQL] - insert into Author (firstName, lastName, version) values (?, ?, ?) 14:41:34,298 DEBUG [org.hibernate.id.IdentifierGeneratorHelper] - Natively generated identity: 1
3、映射:只读视图
利用 JPA 与 Hibernate,您可以以与任何数据库表沟通的方法来映射视图。 只要遵循 Hibernate 的定名约定,您只需要实现一个利用了 @Entity 注解的类,该类的属性为您想要映射的列。
假如视图是只读的,您应该利用 @Immutable 注解汇报 Hibernate。 然后它将忽略对该实体的所有变动。
@Entity @Immutable public class BookView { @Id @Column(name = "id", updatable = false, nullable = false) private Long id; @Column(name = "version") private int version; @Column private String title; @Column @Temporal(TemporalType.DATE) private Date publishingDate; @Column private String authors; ... }
4、查询:MySQL特有的函数与数据范例
作为一个数据库,MySQL 利用一组自界说函数和数据范例来扩展 SQL 尺度。 个中的例子是 JSON 数据范例和 sysdate 函数。