Skip to main content

hibernate

不要使用CascadeType.ALL

Submitted by taotao on Sat, 06/08/2019 - 18:16

概述

         在使用Hibernate级连设置的时候,我们可以设置CascadeType.ALL, 这样如果删除了父对象,就会导致相关的子对象也会被删除。而如果子对象是可以独立存在,那么就不能被删除,本文主要介绍设置了CascadeType.ALL之后,父子对象被级连删除的详细情况和应该如何设置级连属性。

详细介绍

         假设我们有一个Student实体和一个Course实体,一个学生会选修多个课程,一个课程可能会被多个学生选择,所以我们这里就可以有如下的实体定义:

Tags

如何在Hibernate中转义SQL中的关键字

Submitted by taotao on Mon, 06/03/2019 - 17:49

概述

        我们在实际的项目中,可能会将一些SQL的关键字作为实体的属性名,我们可能会使用如下的数据库:MySQL 、PostgreSQL 、SqlServer,每个数据库都有各自不同的保留关键字,因此如果我们要将这些关键字作为实体属性的名称,或者数据库的表名,数据库就会报错。如何解决这个问题?我们可以用如下的两个方法。

在实体定义的时候通过 标注的方式指定

我们如果有如下的实体定义

Tags

Hibernate中的实体状态切换

Submitted by taotao on Sun, 06/02/2019 - 16:24

概述

        我们在使用ORM工具时,直接和实体进行交互,就可以操作数据库,不再需要写 SQL语句。但是Hibernate不是软件饮弹,我们还是需要关注它生成出来SQL。那么在一次操作的过程中实体会经历哪些状态?各个状态又有哪些含义和作用?

详细解释

Transient

         一个对象刚创建时的状态,这个状态下的对象还没有映射为数据库中的记录。只有调用Session.save()或者 EntityManager.persist()方法的时候,状态会切换为Managed。

Managed

          刚创建的对象通过调用Session.save()或者EntityManager.persist()方法的时候,就会从 Transient状态切换到Managed状态,该状态下的对象的任何属性值改变都会在Session.flush()的时候,自动同步到数据库中,因此我们不需要手动执行insert/update/delete这些方法。

Tags

如何在Hibernate中配置MySQL主键自动生成策略

Submitted by taotao on Mon, 05/27/2019 - 12:18

概述

        我们在使用Hibernate操作MySQL数据库的时候,会遇到主键配置的问题,因为MySQL没有提供 像Oracle或者PostgreSQL的sequence机制。因此我们如果使用基于Sequence的机制生成主键时,Hibernate会自动为我们生成一个Hibernate_Sequence的表,所以当我们要创建实体的时候,Hibernate会首先从这个表里获取当前值,然后将累加后的值作为新对象的ID值,保存到数据库中。同时 MySQL本身提供主键自增长机制,我们可以结合Hibernate主键自动生成机制实现在保存新对象的时候,自动插入新的ID值,不需要在创建对象的时候明确指定ID。下面这两种的方式的详细介绍和差异对比分析。

利用MySQL的主键自增长机制创建对象

详细描述

步骤1,在创建 MySQL表的主键的时候,需要确保主键是自增长的,可以按照如下的方式设置: 

Tags

JPA中的OneToMany和ManyToOne的最佳实践

Submitted by taotao on Sun, 05/26/2019 - 12:49

概述

        我们在使用JPA的时候,会使用OneToMany表示对象之间的一对多的关系,ManyToOne表示多对一的关系。多对一和一对多只是对象关系中的正面描述和反面描述,在JPA中不一样的定义方法会有不同的SQL生成,对性能会有比较大的影响。比如我们举一个例子:一个学校会有很多的学生,很多学生都会在一个学校上学,那么我们应该会设计一个父对象School和一个子对象Student,School实体会和和Student之间有一对多的关联关系,Student实体和School实体有多对一的关联关系。在JPA中对于上述的场景描述我们会有三个不同的做法:

  1. 在父对象中使用@OneToMany建立和子对象的关系关系
  2. 在父对象中使用@OneToMany和@JoinColumn来建立和子对象的关系
  3. 建立双向关系,在父对象中使用OneToMany,在子对象中使用ManyToOne
  4. 在子对象中使用ManyToOne建立和父对象的联系

 

Tags