Hibernate(学习笔记)

简介

hibernate是全自动,重量级,ORM框架。mybatis是半自动,轻量级,ORM框架

ORM框架作用:解放JDBC,及SQL操作

1 核心配置

resources/hibernate.cfg.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>								
<!DOCTYPE hibernate-configuration PUBLIC								
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"								
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">								
<hibernate-configuration>								
    <session-factory>								

    </session-factory>								
</hibernate-configuration>								

1.1 数据库连接信息

<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>

<property name="connection.url">jdbc:mysql://localhost:3306/数据库名?characterEncoding=UTF-8</property>

<property name="connection.username">root</property>

<property name="connection.password">root</property>

1.2 指定SQL方言

注释:指定执行哪个数据库的SQL

MySQL5: <property name="dialect">org.hibernate.dialect.MySQL57InnoDBDialect</property>

PostgreSQL:org.hibernate.dialect.PostgreSQLDialect

Oracle10g:org.hibernate.dialect.Oracle10gDialect

1.3 关闭二级缓存

<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

1.4 SQL显示

控制台Log显示:<property name="show_sql">true</property>

显示SQL的format: <property name="format_sql">true</property>

1.5 数据库表生成方式

<property name="hbm2ddl.auto">update</property>

create:每次创建SessionFactory删除表,重新创建

update:表存在检查(不同更新,相同不变),表不存在创建表。// 一般使用这个

create-drop:每次创建SessionFactory删除表,重新创建(关闭会话工厂会直接删除表)

validate:检测(表结构不一致报错)

1.6 指定映射实体

<mapping****resource="com/xx/User.hbm.xml"></mapping> //配置映射文件方式

<mapping****class="com.xx.User"></mapping> //配置注解类方式

注释:多个实体,需要指定多个

1.7 数据库连接池

<property name="hibernate.c3p0.max_size">100</property> // 最大连接数

<property name="hibernate.c3p0.min_size">5</property> // 最小连接数

<property name="hibernate.c3p0.timeout">5000</property> // 连接超时时间(毫秒)

<property name="hibernate.c3p0.max_statement">100</property> // 最大PreparedStatement数

<property name="hibernate.c3p0.idle_test">120</property> // 空闲连接检测间隔(秒)

<property name="hibernate.c3p0.acquire_increment">2</property> // 每次分配连接数据

<property name="hibernate.c3p0.validate">false</property> // 每次验证连接是否可用

2 API接口

2.1 SessionFactory(会话工厂)

获取会话工厂

java 复制代码
StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
// 默认加载 hibernate.cfg.xml,也可指定文件
// StandardServiceRegistry registry = new 
// StandardServiceRegistryBuilder().configure("/hibernate.cfg.xml").build();
SessionFactory sf = new MetadataSources(registry).buildMetadata().buildSessionFactory();

2.2 Session(会话)

Session session = sf.openSession(); // 获取会话

session.save(obj); // 插入数据(无论是否持久状态,主键是否冲突,根据自增策略,正常插入)

session.get(实体类.class, id); // 获取数据(立即加载)

session.load(实体类.class, id); // 获取数据(延迟加载)

session.update(ojb); // 更新数据(new对象,查询对象,都可正常更新,DB没数据异常)

session.saveOrUpdate(obj); // DB有则更新,无则插入

session.delete(obj); // 删除数据(new对象,查询对象,都可正常删除,DB没数据异常)

2.3 Transaction(事务)

(1) 获取事务

Transaction tx = session.beginTransaction(); // 获取并开启事务

Transaction tx = session.getTransaction(); // 获取事务

tx.begin(); //开启事务

tx.commint(); // 提交事务

tx.rollback(); //回滚事务

tx.wasCommited(); //判断是否已提交

tx.wasRolledBack(); //判断是否已回滚

2.4 Query(查询)

Query query = session.createQuery(HQL); // 创建hql查询

注释:其它函数(略)参照后记HQL

2.5 共通类封装

java 复制代码
public class HibernateUtil {
    private static SessionFactory factory;
    static {
        try {
        } catch (HibernateException e) {
        }
    }
    public static SessionFactory getSessionFactory() {
        return factory;
    }
    public static Session getSession() {
        if (factory != null) {
            return factory.openSession();
        }
        return null;
    }
    public static closeSession(Session session) {
        if (session != null && session.isOpen()) {
            session.close();
        }
    }
}

3 生命周期

3.1 三种状态

3.1.1 临时状态

注释:new 出来的对象,Session没有对其绑定,数据库中没有。

对象(〇),session(×),数据库(×)

3.1.2 持久状态

注释:对象已经持久化,已加入到session中

对象(〇),session(〇),数据库(〇)

3.1.3 游离状态

注释:对象已经持久化,未加入到session中

对象(〇),session(×),数据库(〇)

3.2 状态变更

临时状态:new, delete后, 变为临时状态(只有内存有对象)

持久状态:save,update后,变为持久状态(内存,会话,数据库都存在)

游离状态:clear,close后,变为游离状态,(会话不存在)

注释:临时状态直接 update() 违规:会更新全部自动,包括未设定null。临时状态应该,先查询,后更新,删除。

4 实体映射

(1) 配置文件的主键生成策略:

increment: 为long,short,int属性生成唯一标识(不能有其它进程操作同一个表)

identity: 为DB2,MySQL, SQLServer生成 long,short,int类型唯一标识

sequence: 为DB2, PostgreSQL, Oracel生成 long, short, int 类型唯一标识

nactive: 根据数据库自动选择(identity, sequence)

foreign: 使用另一个对象的唯一标识(与on-to-ont联合使用)

(2) 配置文件property常用属性

name: 实体类属性名

column: 表中字段名

type: 表字段类型

not-null: 表字段是否非空

length: 表字段长度

unique: 表字段是否唯一

lazy: 设置延迟加载

4.1 基本映射

注释:将类映射成一张表

(1) 实体类

src/main/java/com/xx/pojo/User.java

java 复制代码
public class User {
    private Integer id;
    private String name;
    ...get, set
}

(2) 映射文件

src/main/resources/com/xx/pojo/User.hbm.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.xx.pojo">
    <class name="User" table="tb_user">
        <id name="id" column="user_id">
            <generator class="native"/>
       </id>
        <property name="name" column="user_name" />
    </class>
</hibernate-mapping>

(3) 数据库表

注释:创建好数据库,表无需创建,执行SessionFactory自动创建。

4.2 关联映射

4.2.1 一对一映射

注释:将每个类各自映射成一张表

(1) 主键关联

Student类

java 复制代码
public class Student {
    private Integer id;
    ...
    private Card card; // 指定关联的另一个实体对象
    ...get, set
}

Card类

java 复制代码
public class Card {
    private Integer id;
    ...
    private Student student; // 关联的另一个实体对象
    ...get,set
}

Student配置文件(Student.hbm.xml)

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xx.pojo">
    <class name="Student" table="tb_student">
        <id name="id" column="student_id">
            <generator class="native"/>
       </id>
       <property name="..." column="..." />
       <!-- 指定一对一映射对象 -->
       <one-to-one name="card" class="com.xx.Card" cascade="all" fetch="join"/>
    </class>
</hibernate-mapping>

Card配置文件(Card.hbm.xml)

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xx.pojo">
    <class name="Card" table="tb_card" lazy="true">
        <id name="id" column="card_id">
            <generator class="foreign">
                <param name="propertye">student</param>
            </generator>
       </id>
       <property name="..." column="..." />
       <!-- 指定一对一映射对象 -->
       <one-to-one name="student" class="com.xx.Student" constrained="true" />
    </class>
</hibernate-mapping>

(2) 外键映射

注释:参照多对一映射,外键映射是多对一映射的特例。

4.2.2 一对多映射

注释:将每个类各自映射成一张表

(1) 单向一对多

Employee类

java 复制代码
public class Employee {
    private Long id;
    ...
    ...get,set
}

Department类

java 复制代码
public class Eepartment {
    private Long id;
    ...
    private Set<Employee> employees;
    ...get,set
}

Employee配置文件(Employee.hbm.xml)

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xx.pojo">
    <class name="Employee" table="tb_employee">
        <id name="id" column="employee_id">
            <generator class="native"/>
       </id>
       <property name="..." column="..." />
    </class>
</hibernate-mapping>

Department配置文件(Department.hbm.xml)

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xx.pojo">
    <class name="Department" table="tb_department">
        <id name="id" column="department_id">
            <generator class="native"/>
       </id>
       <property name="..." column="..." />
       <!-- 指定一对多映射对象 -->
       <set name="emplyees" table="employee"  <!-- name类属性名, table表名 -->
            lazy="false" inverse="false"      <!-- lazy延迟加载,inverse被关联表管理-->
            cascade="all" sort="unsorted">    <!-- cascade所有情况都级联操作,不排序-->
          <key column="dept_id"/>             <!-- 外键名 -->
          <one-to-many class="com.xx.Employee"/> <!-- 指定多放对象 -->
       <set/>
    </class>
</hibernate-mapping>

注释:单向一对多(先存一,再存多,最后更新一),没有单向多对一效率高

(2) 单向多对一

Student类

java 复制代码
public class Student{
    private Integer id;
    ...
    private School school;
    ...get, set
}

School类

java 复制代码
public class School {
    private String schoolCode
    ...
    ...get, set
}

Student配置类(Student.hbm.xml)

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xx.pojo">
    <class name="Student" table="tb_Student">
        <id name="id" column="Student_id">
            <generator class="native"/>
        </id>
        <property name="...", columa="..."/>
        <many-to-one name="school" class="School" 
            column="school_code"
            foreign-key="fk_school"
            not-null="true"></many-to-one>
    </class>
</hibernate-mapping>

School配置类(School.hbm.xml)

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xx.pojo">
    <class name="School" table="tb_school">
        <id name="schoolCode" column="school_code">
            ...
        </id>
        <property name="...", columa="..."/>
    </class>
</hibernate-mapping>

注释:如果外键不可为空,则必须先插入外键表数据。(外键可以为空,也建议先存储外键数据,否则插入后会二次更新主表外键)

(3) 双向关联

Student类

java 复制代码
public class Student{
    private Integer id;
    ...
    private School school;
    ...get, set
}

School类

java 复制代码
public class School {
    private String schoolCode;
    ...
    private Set<Student> students;
    ...get, set
}

Student配置类(Student.hbm.xml)

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xx.pojo">
    <class name="Student" table="tb_Student">
        <id name="id" column="Student_id">
            <generator class="native"/>
        </id>
        <property name="...", columa="..."/>
        <many-to-one name="school" class="School" 
            column="school_code"
            foreign-key="fk_school_code"
            not-null="true"></many-to-one>
    </class>
</hibernate-mapping>

School配置类(School.hbm.xml)

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xx.pojo">
    <class name="School" table="tb_school">
        <id name="schoolCode" column="school_code">
            ...
        </id>
        <property name="...", columa="..."/>
        <!-- inverse=true让School被关联表管理-->
        <set name="students" table="tb_student" 
            lazy="false" inverse="true"     
            cascade="all" sort="unsorted"> 
          <key column="school_code" foreign-key="fk_school_code" not-null="true"/>
          <one-to-many class="com.xx.Student"/>
        <set/>
    </class>
</hibernate-mapping>

4.2.3 多对多映射

略:

4.3 组件映射

注释:将所有类映射成一张表(插入数据是将所有的的属性插入到同一个表里)

Address类

java 复制代码
public class Address
    private String city;
    ...
    ...get, set
}

Person类

java 复制代码
public class Person {
    private Long id;
    ...
    private Address address;
    ...get, set
}

Address配置文件(略)

Person配置文件

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xx.pojo">
    <class name="Person" table="tb_person">
        <id name="id" column="person_id">
            ...
        </id>
        <property name="...", columa="..."/>
        
        <component name="address" class="Address"> 
          <property name="city"/>
          <property name="..."/>
        </component>
    </class>
</hibernate-mapping>

4.4 继承映射

4.4.1 所有类映射

注释:将所有类映射到一张表中(表中有区分字段)

Person父类

java 复制代码
public class Person {
    private Long id;
    private String name;
    ...get, set
}

Employee子类

java 复制代码
public class Employee extends Person {
    private double salary;
    ... get, set
}

Student子类

java 复制代码
public class Student extends Person {
    private String major;
    ...get,set
}

Person配置类(Person.bhm.xml)

subClass + discriminato-value

XML 复制代码
<hibernamte-mapping package="com.xx.pojo">
  <class name="Person" table="person"
        discriminator-value="PERSON">
    <id name="id" type="java.lang.Long">
        <column name="id"/>
        <generator class="identity"/>
    </id>

    <discriminator column="person_type" type="string"/>

    <property name="..." column="..."/>

    <subclass name="Employee" discriminator-value="EMP">
        <property name="salary" type="double">
            <column name="salary"/>
        </property>
    </subclass>

    <subclass name="Student" discriminator-value="STUDENT">
        <property name="major" type="java.lang.String">
            <column name="major"/>
        </property>
    </subclass>
  </class>
</hibernate-mapping>

session.save(new Person(id, name)) -> 插入person表(id,person_type=PERSON, name, salary=null, major=null)

session.save(new Employee(id, name, "xxx")) -> 插入person表(id,person_type=EMP, name, salary=null, major="xxx")

session.save(new Student(id, name, 2000)) -> 插入person表(id,person_type=STUDENT, name, salary=2000, major=null)

4.4.2 子类映射

注释:每个类映射成一张表(基于主键关联)

(1)类同上(略)

(2)配置文件

joined-subClass + table + key

XML 复制代码
<hibernamte-mapping package="com.xx.pojo">
  <class name="Person" table="person">
    <id name="id" type="java.lang.Long">
        <column name="person_id"/>
        <generator class="identity"/>
    </id>

    <discriminator column="person_type" type="string"/>

    <property name="..." column="..."/>

    <joined-subclass name="Employee" table="employee">
        <key column="person_id"/>
        <property name="salary" type="double">
            <column name="salary"/>
        </property>
    </joined-subclass>

    <joined-subclass name="Student" table="student">
        <key column="person_id/>
        <property name="major" type="java.lang.String">
            <column name="major"/>
        </property>
    </joined-subclass>
  </class>
</hibernate-mapping>

session.save(new Person(id, name)) -> 插入person表(id,name)

session.save(new Employee(id, "xxx")) -> 插入Employee表(id,major="xxx")

session.save(new Student(id, 2000)) -> 插入Student表(id,salary=2000)

4.4.3 具体类映射

注释:每个子类映射成一张表(都包含主类属性)

(1)类同上(略)

(2)配置

u****nion-subClass + table

XML 复制代码
<hibernamte-mapping package="com.xx.pojo">
  <class name="Person" abstract="true">
    <id name="id" type="java.lang.Long" column="person_id">
        <generator class="assigned"/>
    </id>

    <discriminator column="person_type" type="string"/>

    <property name="..." column="..."/>

    <union-subclass name="Employee" table="employee">
        <property name="salary" type="double">
            <column name="salary"/>
        </property>
    </union-subclass>

    <union-subclass name="Student" table="student">
        <property name="major" type="java.lang.String">
            <column name="major"/>
        </property>
    </union-subclass>
  </class>
</hibernate-mapping>

session.save(new Employee(id, name, "xxx")) -> 插入Employee表(id, name, major="xxx")

session.save(new Student(id, name, 2000)) -> 插入Student表(id,name, salary=2000)

5 HQL

注释:HQL是Java以SQL的形式操作对象(框架会通过对象获取或更新数据库)

获取对象:Query query = session.createQuery(hql);

5.1 查询

5.1.1 语法

(1) 全属性查询 :String hql = "SELECT 别名FROM 类 别名" // hql不支持select *

(2) 全属性查询 :String hql = "FROM 类 " // 可以省略select相当于全部查询

(3) 指定属性 :String hql = "SELECT 属性1, 属性2 FROM 类"

(4) 指定返回类型 :String hql = "SELECT new 类(属性1, 属性2) FROM 类"

5.1.2 获取结果方式

(1) list: List<类> list = query.list();

(2) iterator: Iterator<类> it = query.iterate();

5.1.3 获取结果类

(1) 单字段查询List<String> list = query.list(); // 适用于Select 单属性

(2) 多字段查询: List<Object> list = query.list(); // 适用于Select * 或 select 多属性

(3) 指定返回类型: List<> list = query.list(); // 语法参照5.1.1.(4)

5.2 查询条件

5.2.1 条件

(1) 算数运算:+, -, *, /,

(2) 比较符号:=, !=, >, >=, <, <=

(3) 逻辑符号:not, and, or

(4) 关键字:in, like, between, is null...

(5) 字符串拼接:||

5.2.2 语法

注释:同SQL一样

(1) String hql = "select * from 类 别名 WHERE 别名.属性 = ?"

(2) String hql = "select * from 类 别名 WHERE 别名.属性 = :参数名"

5.2.2 参数

(1) 索引传参:query.setParameter( 索引, 值 ); // 索引从0开始,对应hql的"?"

(2) 名称传参:query.setParameter( "参数名", 值 ); // 对应hql的":参数名"

注释:有可以setInteger, setDouble, setBoolean等

java 复制代码
private void fn() {
    String hql = "select ... where 属性=?";
    Query query = session.createQuery(hql);
    query.setParameter(0, "xxx");
    List<Object> list= query.list();
}

5.3 其它查询语法

5.3.1 分组

(1) 聚合函数:count, sum, max, min, avg

(2) 语法: String hql = "select ... from 类GROUP BY 属性 HAVING 属性 = 值"

5.3.2 排序

(1) 默认升序:String hql = "select ... from 类ORDER BY 属性"

(2) 指定升降:String hql = "select ... from 类ORDER BY 属性1 ASC, 属性2 DESC"

5.3.3 关联表

(1) 内联:String hql = "select ... from 类1**INNER JOIN** 类2 ON 类1.属性=类2.属性"

5.3.4 查询件数

(1) 获取结果集的开始行:query.setFirstResult(int); // 0开始,过滤掉开始行之前的数据

(2) 获取结果集的总行数:query.setMaxResults(int); // 设置返回结果的最大行数

5.4 更新删除

5.4.1 更新

(1) 更新语法:String hql = "UPDATE 类 SET 属性 = :参数1 WHERE 属性 = :参数2"

(2) 获取Query:Query query = session.createQuery(hql);

(3) 设定参数:query.setParameter("参数名", 值); // 参数名相对于索引能防止SQL注入

(4) 执行更新:int i = query.executeUpdate();

5.4.2 删除

(1) 更新语法:String hql = "DELETE FROM 类 WHERE 属性 = :参数"

(2) 获取Query:Query query = session.createQuery(hql);

(3) 设定参数:query.setParameter("参数名", 值);

(4) 执行更新:int i = query.executeUpdate();

6 其它查询

6.1 条件查询

6.1.1 创建条件类

(1) Criteria crit = session.createCriteria(类.class);

6.1.2 条件函数

(1) Restrictions:Restrictions .eq(属性, 值) // eq相等, gt大于, lt小于, le 小于等于, between, like, in, and, or, isNull, isNotNull

(2) Order:Order.asc(属性) // asc升序, desc降序

6.1.3 追加条件

crit.add(Restrictions.like("属性名", "值");

crit.add(Restrictions.gt("属性名", 值); // 多个条件默认是and关系

crit.addOrder(Order.asc("属性名")); //排序用addOrder

6.1.3 获取结果

List<类> list = crit.list();

6.2 SQL查询

6.2.1 编辑SQL

String sql = "select * from 表 表别名 where 条件"; // 用的是基本SQL

6.2.2 获取查询对象

SQLQuery sqlQuery = session.createSQLQuery(sql); // 获取实现Query接口的SQLQuery对象

6.2.3 绑定实体与表

sqlQuery.addEntity("表别名", 实体类.class);

6.2.4 获取结果

List<类> list = sqlQuery.list();

6.3 命名查询

6.3.1 配置文件

Studen.hbm.xml // 在class标签同级添加下列配置,其它配置可以参照4实体映射部分

XML 复制代码
<query name="findStudentByName">
    <![CDATA[
        FROM Student s WHERE s.name = :name
    ]]>
</query>

6.3.2 获取查询对象

Query query = session.getNamedQuery("findStudentByName")

6.3.3 获取结果

List<类> list = query.list();

7 注解

注释:替代 映射文件 xxx.hbm.xml

7.1 基本映射

实体类:@Entity

映射表:@Table

主键:@Id

主键策略:@GeneratedValue

表字段名:@Column

java 复制代码
@Entity
@Table(name="tb_student")
public class Student {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private Integer id;

    @Column(name="name")
    private String name;
    ...get, set
}

7.2 关联映射

7.2.1 一对一映射

(1) 一对一:@OneToOne

// cascade属性:CascadeType.All 所有操作更新关联表,PERSIST 插入操作更新关联表,MERGE 修改操作更新关联表,REMOVE 删除操作更新关联表。

// fetch属性:FetchType.EAGER 立即加载,LAZY懒加载

(2) 外键:@JoinColumn

java 复制代码
@Entity
@Table(name="tb_student")
public class Student {
    ...id, column

    @OneToOne
    @JoinColumn(name="自身外键字段名")
    private Acount acount;

    ...get, set
}

7.2.2 一对多映射

(1) 一对多:@OneToMany

java 复制代码
@Entity
@Table(name="tb_student")
public class Student {
    ...id, column

    @OneToMany
    @JoinColumn(name="与主表外键关联的Message表的字段名")
    private List<Message> msg;

    ...get, set
}

(2) 多对一:@ManyToOne

java 复制代码
@Entity
@Table(name="tb_message")
public class Message {
    ...id, column

    @ManyToOne
    @JoinColumn(name="主表外键字段名")
    private Student student;

    ...get, set
}

7.2.3 多对多映射

7.3 组件映射

7.3.1 组件类

@Embeddable

java 复制代码
@Embeddable
public class Address {
    private String street;
    private String city;
    private String zipCode;
    ...get, set
}

7.3.2 引用组件

@Embedded

java 复制代码
@Entity
public class Person {
    ...

    @Embedded
    private Address address;

    ...get,set
}

7.4 继承映射

7.4.1 属性继承

注释:父类不生成表,将父类属性生成在子类表中

(1) 父类

@MappedSuperclass

java 复制代码
@MappedSuperclass
public class Person{

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

    ...get,set
}

(2) 子类

java 复制代码
@Entity
@Table(name = "tb_employee")
public class Employee extends Person {
    ...
}

7.4.2 继承策略

java 复制代码
@Entity
@Table(name = "person")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // 使用单表策略
@DiscriminatorColumn(name = "person_type") // 指定区分字段名
public class Person {
    @Column(name = "name")
    private String name;
    ...get,set
}
java 复制代码
@Entity
@DiscriminatorValue("E") // 指定此实体在区分字段中的值,用于区分实体类型
public class Employee extends Person {
    // Other fields and methods...
}

(1) 所有类

注释:映射到同一张表

InheritanceType.SINGLE_TABLE

(2) 子类

注释:映射到不同表,子表包含主表的关联字段(如id)

InheritanceType.JOINED

(3) 具体类

注释:每个子表映射成一张表(各自包含主表全部自动)

InheritanceType.TABLE_PER_CLASS

8 Spring整合

注释:将hibernate数据源,SessionFactory整合到Spring配置文件中,不在配置hibernate.cfg.xml

8.1 Spring配置

applicationContext.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">
        <propertye name="driverClass" value="com.mysql.jdbc.Driver" />
        <propertye name="jdbcUrl" value="jdbc:mysql://localhost:3306/dbName" />
        <propertye name="user" value="root" />
        <propertye name="password" value="123456" />

        <propertye name="maxPoolSize" value="40" />
        <propertye name="minPoolSize" value="1" />
        <propertye name="initialPoolSize" value="1" />
        <propertye name="maxIdleTime" value="20" />
    </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mappingResources">
            <list>
                <value>com/entity/Student.hbm.xml</value>
            </list>
        </property>

        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
            </props>
        </property>
    </bean>
</beans>

8.2 访问数据库

注释:将SessionFactory注入dao访问DB

9 个人总结

session:用来查询,更新,删除,单个对象(相当于单条记录)

映射关系:与session组合使用,用来 查询,更新,删除,单个对象及与其映射的多个对象

HQL:用来 查询,更新,删除多条记录 (注释:select 别名 from 类 别名from 类获取的是持久化对象,纳入session管理。select 类.属性select new 类 不被session管理)

相关推荐
lunzi_08261 小时前
【学习笔记】《Python编程 从入门到实践》第5章:if语句、条件测试与列表处理实战
笔记·python·学习
fanged1 小时前
蓝牙学习3(简易蓝牙控制)(TODO)
笔记
仙俊红1 小时前
rocketmq学习
大数据·学习·rocketmq
子一!!1 小时前
spring基础学习
java·学习·spring
呼Lu噜2 小时前
生命周期模型概述(软考教材版)
学习·软件工程
胡图图不糊涂^_^2 小时前
白盒测试——动态测试——逻辑覆盖法
笔记·测试·动态测试·白盒测试·逻辑覆盖法
凯尔萨厮2 小时前
创建Hibernate Web项目(配置类)
后端·hibernate
吃好睡好便好3 小时前
矩阵旋转的计算
学习·线性代数·算法·矩阵
江华森3 小时前
TCP/IP 网络协议学习笔记(含上机实操)
网络协议·学习·tcp/ip