欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 宝鼎售后问题提交 | 后台管理


新闻资讯

MENU

软件开发知识

利用 Hibernate 和 劳务派遣信息管理系统 MySQL 需要知道的五件事

点击: 次  来源:宝鼎软件 时间:2017-10-28

原文出处: Oopsguy

利用 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 函数。