首页 > 其他分享 >重量级ORM框架--持久化框架Hibernate【JPA注解开发】

重量级ORM框架--持久化框架Hibernate【JPA注解开发】

时间:2022-09-30 11:01:10浏览次数:81  
标签:customer Hibernate name 框架 -- private JPA 注解 id


hibernate

​ Hibernate是一款重量级的持久层框架,目前市面上的我很少见还有项目在开发时候使用他,之所以要学习这个,因为公司最近有一个系统升级的项目,之前的老系统用到了Hibernate。​

重量级ORM框架--持久化框架Hibernate【JPA注解开发】_后端

同样还是老套路,学习一个新技术或者新知识,首先去他的官网看

【官网】:​​https://hibernate.org/orm/​​​ 【官方教程】:h​​ttps://hibernate.org/orm/documentation/getting-started/​​ 【github地址】:​​https://github.com/hibernate​


目前hibernate已经更新到了6的版本,这里使用的5的版本

重量级ORM框架--持久化框架Hibernate【JPA注解开发】_实体类_02

注意: Hibernate5.1;5.2官方推荐使用JDK1.8以及JDBC4

文章目录


一、Hibernate与JPA的关系

重量级ORM框架--持久化框架Hibernate【JPA注解开发】_hibernate_03

​本章主要讲解的是 JPA的一些注解​

二、JPA的基础入门

需求:同样是一个Customer的类,与之前不同的是,这次采用JPA的注解开发,省去了原有的实体映射的XML文件配置
【Customer实体类】

@Entity
@Table(name = "t_customer_jpa")
public class Customer implements Serializable {

private static final long serialVersionUID = 1L;

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

@Column(name = "name")
private String name;
@Column(name = "gender")
private String gender;
// getter、setter...
}

注解说明:

  • ​@Entity注解:​​标识一个实体类的JavaBean对象,每个持久化POJO类都是一个实体Bean,
  • ​@Table注解:​​实体Bean指定对应数据库表,解决数据库表面与实体类不对应的关系
  • ​@Column注解:​​实体类中的属性字段与数据库表中的字段名对应匹配
  • ​@Transient:​​表示该字段不被持久化到数据库
  • ​@Id注解:​​标识该字段是一个主键字段
  • ​@GeneratedValue注解:​​​组建的生成策略,其中的策略和之前介绍的一样,使用​​GenerationType​​生成

【核心配置文件hibernate.cfg.xml】

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!--连接数据库的相关参数-->
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_db?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>

<!-- DB 方言 -->
<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>

<!--hibernate扩展参数-->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!--<property name="hibernate.hbm2ddl.auto">create</property><!–每次操作Hibernate都是创建一个新的–>-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--让Session管理ThreadLocal-->
<property name="current_session_context_class">thread</property>

<!--使用注解的 配置-->
<mapping class="com.wei.domain.Customer"/>
</session-factory>
</hibernate-configuration>

注意事项:​由于使用了JPA注解开发,省去了原有的实体映射配置文件,所以这里的mapping采用calss的配置方式​

【测试代码】

@Test
public void test1() throws HibernateException {
Customer customer = new Customer();
// customer.setId(1);
customer.setName("里斯");
customer.setGender("女");
Session session = HibernateUtil.getConnection();
//4、开启事务
Transaction tx = session.beginTransaction();
//5、执行添加操作
session.save(customer);
//6、提交事务
tx.commit();
//7、关闭资源
HibernateUtil.closeSession(session);
}

重量级ORM框架--持久化框架Hibernate【JPA注解开发】_hibernate_04

三、@Transient注解

@Transient:以为临时的意思,也就是被@Transient注解注释的属性,它默认是不被反应到数据库上的

// 临时字段 不反应到数据库中
@Transient
private boolean isMarried;

使用该注解在添加的时候不会往数据库中添加新建此字段

四、JPA主键策略

JPA主键策略,没有Hibernate主键策略丰富

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

常见的主键策略:

  1. TABLE:利用JPA生成表维护主键值
  2. SEQUENCE:使用序列的自增长 Oracle
  3. IDENTITY:数据库的自增长能力,MySQL
  4. AUTO:自动匹配数据库源来实现自动配置主键自增策略

说明:使用Table的主键策略后,Hibernate会自动生成一个hibernate_sequences的表,通过模拟Oracle的序列来实现主键自增。

五、JPA的关系映射

5.1 一对多映射

【Customer实体类】—一方

@Entity
@Table(name = "t_customer_jpa")
public class Customer implements Serializable {

private static final long serialVersionUID = 1L;

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

@Column(name = "name")
private String name;
@Column(name = "gender")
private String gender;

// 关联订单
@OneToMany(targetEntity = Order.class,mappedBy = "customer")
private Set<Order> orders = new HashSet<Order>();
// getter、setter...
}

【Order实体类】— 多方

@Entity
@Table(name = "t_order_jpa")
public class Order implements Serializable {

private static final long serialVersionUID = 1L;

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

@Column(name = "order_no")
private String orderNo;

// 关连客户
@ManyToOne(targetEntity = Customer.class)
@JoinColumn(name = "cust_id")
private Customer customer;
// getter、setter...
}

说明:

  • 在一方使用注解@OneToMany表示target的关联实体类为​​Order.class​​​,使用mapperBy标识被关联实体类中的关联字段​​customer​​;
  • 在多方使用注解@ManyToOne标识一方的关联实体类,并使用​​@JoinColumn​​​注解标识数据库中所关联表的的字段名为​​cust_id​

5.1.1 测试

/**
* 演示一对多的测试
* @throws HibernateException
*/
@Test
public void test2() throws HibernateException {
Customer customer = new Customer();
customer.setName("JACK");
customer.setGender("男");

Order o1 = new Order();
o1.setOrderNo("2022081100001");
o1.setCustomer(customer);

Order o2 = new Order();
o2.setOrderNo("2022081100002");
o2.setCustomer(customer);

Session session = HibernateUtil.getConnection();

//4、开启事务
Transaction tx = session.beginTransaction();

//5、执行添加操作
session.save(customer);
session.save(o1);
session.save(o2);


//6、提交事务
tx.commit();

//7、关闭资源
HibernateUtil.closeSession(session);
}

重量级ORM框架--持久化框架Hibernate【JPA注解开发】_java_05


重量级ORM框架--持久化框架Hibernate【JPA注解开发】_数据库_06

5.2 多对多映射

【User实体类】

@Entity
@Table(name = "t_user_jpa")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;

@Column(name = "name")
private String userName;

/*
* joinColumns表是当前方在中间表的列名
* inverseJoinColumns表示对方表在中间表的列名
* name表示表名
* */
@ManyToMany(targetEntity = Role.class)
@JoinTable(name = "t_user_role_jpa",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
Set<Role> roles = new HashSet<Role>();
}

【Role实体类】

@Entity
@Table(name = "t_role_jpa")
public class Role implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;

@Column(name = "name")
private String roleName;

@ManyToMany(targetEntity = User.class,mappedBy = "roles")
Set<User> users = new HashSet<User>();
}


标签:customer,Hibernate,name,框架,--,private,JPA,注解,id
From: https://blog.51cto.com/u_14957231/5725637

相关文章

  • go 语言的 slice 注意点
    前言起因是在编写某个模块时,考虑到slice良好的伸缩性,便使用slice来存储大量的数据,业务是slice的数据会慢慢的弹出减少,理想状态下内存占用会越来越少,结果发现,......
  • Vue面试题27:为什么要使用路由懒加载?(总结自B站up主‘前端杨村长’视频,仅供自用学习)
    这是一道应用题。当打包应用时,JavaScript包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问时才加载对应组件,这样就会更加......
  • 使用福禄克CFP光纤测试仪进行Tier 1和Tier 2光纤测试
    与可通过光损耗测试仪(OLTs)实现的衰减(插入损耗)、长度和极性所需的第1层测试不同,该领域的技术人员很少会面临第2层测试和光时域反射计(OTDR)的需要。但偶尔会有一位客户或顾问指......
  • 计算机保研经验分享
    1.关于保研随着928的结束,2023届轰轰烈烈的保研也就这么结束了。从五六月份开始准备各种材料,包括打印、签名、写推荐信、成绩证明、证书等等,然后是报无数个学校,填无数个报......
  • 福禄克DSX2-5000ch网线认证测试仪为您规避布线错误
    虽然安装、测试和认证网络布线设备的聪明人知道满足标准性能参数和确保应用程序支持的重要性,但即使是我们中最优秀的人也可能犯错误,对底线和客户满意度产生不利影响。让我们......
  • sync.waitGroup 原理分析
    前言sync的常用包好像都快讲完了,最近几天进度很快啊,希望能多多保持.sync.WaitGroup是为了解决任务编排而出现的,主要就是解决并发-等待问题,因此在真正编写过程中......
  • socket连接和TCP连接的关系
    我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP、......
  • CSS:鼠标移动到图片上的动画
    CSS:鼠标移动到图片上的动画.picimg{ width:100%; left:0; top:0; right:0; bottom:0; margin:auto; transition:all.5s;}.pic:hoveri......
  • 实体验证--根据某个字段判断另一字段是否必填
    ///<summary>///根据传入属性字段决定是否需要必填字段///</summary>[AttributeUsage(AttributeTargets.Property|AttributeTargets.Field,AllowMul......
  • SQL之前述
    1、背景前不久,买了本SQL必知必会,看了下,然后就开始在某客网刷题,从此篇起,1、准备结合<<SQL必知必会>>和某客网的题目开始记录 2、后面还会去搜......