Hibernate——入门

一、基础

参考:https://mp.weixin.qq.com/s/OYSczfpZQf1xbhApcbYEKg

1.1 ORM概述

ORM:是一种思想。关注是对象与数据库中的列的关系
O代表的是Objcet。
R代表的是Relative。
M代表的是Mapping。
在这里插入图片描述

1.2 Hibernate框架

含义:Hibernate是一种ORM框架,全称为 Object_Relative DateBase-Mapping。
目的:在Java对象与关系数据库之间建立某种映射,以实现直接存取Java对象!
——关于Java对象和关系数据库之间的联系<==>MVC中的数据持久层->在编写程序中的DAO层。

常用实现DAO层:
——在DAO层操作XML,将数据封装到XML文件上,读写XML文件数据实现CRUD
——在DAO层使用原生JDBC连接数据库,实现CRUD
——嫌弃JDBC的Connection\Statement\ResultSet等对象太繁琐,使用对原生JDBC的封装组件–>DbUtils组件
使用DbUtils组件实现DAO层。

public class CategoryDAOImpl implements CategoryDao {
    @Override
    public void addCategory(Category category) {
        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
        String sql = "INSERT INTO category (id, name, description) VALUES(?,?,?)";
        try {
            queryRunner.update(sql, new Object[]{category.getId(), category.getName(), category.getDescription()});
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
    @Override
    public Category findCategory(String id) {
        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
        String sql = "SELECT * FROM category WHERE id=?";
        try {
            Category category = (Category) queryRunner.query(sql, id, new BeanHandler(Category.class));
            return category;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
    @Override
    public List<Category> getAllCategory() {
        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
        String sql = "SELECT * FROM category";
        try {
            List<Category> categories = (List<Category>) queryRunner.query(sql, new BeanListHandler(Category.class));
            return categories;
        } catch (SQLException e) {
            throw  new RuntimeException(e);
        }
    }
}

使用DbUtils编写DAO层代码的规律;
1、当插入数据时,将JavaBean对象拆分,拼装成SQL语句。
2、当查询数据时,用SQL把数据库表中的列组合,拼装成JavaBean对象。
3、即javaBean对象和数据表中的列存在映射关系!
Hibernate实现了程序能够自动生成SQL语句,简化开发。

1.3 学习一个框架的三个步骤

1、引入jar开发包。
2、配置相关的XML文件
3、熟悉API

二、Hibernate快速入门

2.1 搭建环境

2.1.1 引入相关jar包

jar包含义
hibernate3.jarHibernate3核心包
antlr-2.7.6.jarrequired 必须引入的(6个)
commons-collections-3.1.jarrequired 必须引入的(6个)
dom4j-1.6.1.jarrequired 必须引入的(6个)
slf4j-api-1.6.1.jarrequired 必须引入的(6个)
javassist-3.12.0.GA.jarrequired 必须引入的(6个)
jta.jarrequired 必须引入的(6个)
hibernate-jpa-2.0-1.0.0.Final.jarjpa
mysql-connector-java-5.1.7-bin.jar数据库驱动包

2.1.2 Hibernate主配置文件

路径:放在src目录下的。
hibernate.cfg.xml

<hibernate-configuration>
    <!-- 通常,一个session-factory节点代表一个数据库 -->
    <session-factory>
        <!-- 1. 数据库连接配置 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///zhongfucheng</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <!--
            数据库方法配置, hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql
         -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <!-- 2. 其他相关配置 -->
        <!-- 2.1 显示hibernate在运行时候执行的sql语句 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 2.2 格式化sql -->
        <property name="hibernate.format_sql">true</property>
        <!-- 2.3 自动建表  -->
        <property name="hibernate.hbm2ddl.auto">create</property>
        
        <!--3. 加载所有映射-->
        <mapping resource="zhongfucheng/domain/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

2.2 编写对象和对象映射

对象
User.java

public class User {
    private int id;
    private String username;
    private String password;
    private String cellphone;
    //各种setter和getter
}

对象映射。
路径:一般它和JavaBean对象放在同一目录下。
创建User.hbm.xml

<?xml version="1.0"?>
<!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.my.entity">
    <!--类名为User,表名为user-->
    <class name="User"  table="user">
        <!--主键映射,属性名为id,列名为id-->
        <id name="id" column="id">
            <!--根据底层数据库主键自动增长-->
            <generator class="native"/>
        </id>
        <!--非主键映射,属性和列名一一对应-->
        <property name="username" column="username"/>
        <property name="cellphone" column="cellphone"/>
        <property name="password" column="password"/>
    </class>
</hibernate-mapping>

注册User.hbm.xml。
hibernate.cfg.xml

<mapping resource="zhongfucheng/domain/User.hbm.xml"/>

2.3 测试

User.java

import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
public class App {
    public static void main(String[] args) {
     	// 获取加载配置管理类
        Configuration configuration = new Configuration();
        //不给参数就默认加载hibernate.cfg.xml文件,
        configuration.configure();
        //创建Session工厂对象
        SessionFactory factory = configuration.buildSessionFactory();
        //得到Session对象
        Session session = factory.openSession();
        //使用Hibernate操作数据库,都要开启事务,得到事务对象
        Transaction transaction = session.getTransaction();
        //开启事务
        transaction.begin();
        
        //===========创建对象==========
        User user = new User();
        user.setPassword("123");
        user.setCellphone("122222");
        user.setUsername("nihao");       
        //把对象添加到数据库中
        session.save(user);
        
        // 提交事务
        transaction.commit();
        // 关闭Session
        session.close();
    }
}

三、常用类及方法

3.1 Configuration类

配置管理类:主要管理配置文件的一个类。
它拥有一个子类AnnotationConfiguration,即可以使用注解来代替XML配置文件来配置相对应的信息。

3.1.1 configure方法

作用:configure()方法用于加载配置文件。
加载主配置文件的方法
——若指定参数,则加载参数的路径配置文件
——若未指定参数,默认加载src/目录下的hibernate.cfg.xml。

3.1.2 buildSessionFactory方法

作用:buildSessionFactory()用于创建Session工厂。

3.2 SessionFactory类

作用:Session的工厂,也可以说代表了hibernate.cfg.xml这个文件。

3.2.1 openSession方法

作用:创建一个Session对象。

3.2.2 getCurrentSession方法

作用:创建Session对象或取出Session对象。

3.3 Session类

作用:Session是Hibernate最重要的对象,Session维护了一个连接(Connection),只要使用Hibernate操作数据库,都需要用到Session对象。

3.3.1 更新操作

作用:对数据库的更新。
session.save(obj); 保存一个对象。
session.update(obj); 更新一个对象。
session.saveOrUpdate(obj); 保存或者更新的方法。
——没有设置主键,执行保存
——有设置主键,执行更新操作
——如果设置主键不存在报错

3.3.2 主键查询

作用:通过主键来查询数据库的记录,从而返回一个JavaBean对象。
session.get(javaBean.class, int id); 传入对应的class和id就可以查询。
session.load(javaBean.class, int id); 支持懒加载。

3.3.3 HQL查询

HQL:hibernate query language。hibernate提供的面向对象的查询语言。
——查询的是对象以及对象的属性。
——因此区分大小写!
SQL:Struct query language 。结构化查询语言。
——查询的是表以及列。
——因此不区分大小写!
1、HQL是面向对象的查询语言,可以用来查询全部的数据!

String hql = "FROM User";
Query query = session.createQuery(hql);
List<User> list = query.list();
transaction.commit();
session.close();

2、HQL是面向对象的查询语言,可以传递参数进去查询!

String hql = "FROM User WHERE id = ?";
Query query = session.createQuery(hql);
// 注意:此处?从0开始,jdbc中从1开始。
query.setParameter(0,user.getId());
List<User> list = query.list();
transaction.commit();
session.close();

3.3.4 QBC查询

QBC查询: query by criteria 。 完全面向对象的查询。
HQL查询是需要SQL的基础的,因为还是要写少部分的SQL代码。QBC查询就是完全的面向对象查询,但比较少使用。

// 创建Criteria对象
Criteria criteria = session.createCriteria(User.class);
// 添加条件。
criteria.add(Restrictions.eq("id",1));
// 查询全部数据
List<User> list = criteria.list();

3.3.5 本地SQL查询

若SQL是非常复杂的,不能靠HQL查询来实现功能的话,就需要使用原生的SQL了!
原生的SQL缺陷:不能跨平台。因此,在主配置文件中配置了数据库的“方言“。

SQLQuery sqlQuery = session.createSQLQuery(SELECT * FROM user).addEntity(User.class);
List<User> list = sqlQuery.list();

3.3.6 beginTransaction方法

作用:开启事务,返回的是一个事务对象。
Hibernate规定所有的数据库操作都必须在事务环境下进行,否则报错!

四、主配置文件

主配置文件主要配置:
——数据库的信息
——其他参数
——加载映射文件
常用的配置信息都可以在hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties目录下可以找到。

4.1 数据库信息

常用的配置信息都可以在hibernate.properties文件中找到。

<!-- 1. 数据库连接配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hib_demo</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!-- 
数据库方法配置, hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql【大致可以理解成:不同的版本对应的SQL不同】
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

4.2 其他参数信息

<!-- 2. 其他相关配置 -->
<!-- 2.1 显示hibernate在运行时候执行的sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 2.2 格式化sql -->
<property name="hibernate.format_sql">true</property>
<!-- 2.3 自动建表  -->
<property name="hibernate.hbm2ddl.auto">update</property>

create-drop :每次在创建sessionFactory时候执行创建表。当调用sesisonFactory的close方法的时候,删除表!
create :每次都重新建表; 如果表已经存在就先删除再创建
update :如果表不存在就创建; 表存在就不创建;
validate :(生成环境时候) 执行验证: 当映射文件的内容与数据库表结构不一样的时候就报错!

4.3 加载映射文件

4.3.1 通过主配置文件的方式

<!--3. 加载映射文件-->
<mapping resource="com/my/entity/User.hbm.xml"/>

4.3.2 通过程序的方式

前提:
1、映射配置文件和JavaBean对象是放在同一个包下的。
2、映射文件的命名是有规范的。

//获取加载配置管理类
Configuration configuration = new Configuration();
//加载User的映射文件!
configuration.configure().addClass(User.class);

因此,Hibernate是可以通过提供的JavaBean对象从而找到相对应的映射文件!
一般地,在测试时,使用程序的方式去加载映射文件【方便】。

4.4 映射配置文件

映射文件: 映射一个实体类对象。 描述一个对象最终实现可以直接保存对象数据到数据库中。
通常地,我们都是一个JavaBean对象对应一个映射配置文件,并且配置文件和JavaBean对象是放在同一个目录下的

4.4.1 hibernate-mapping标签

常用的属性
package = “要映射的对象所在的包”。可选,如果不指定,此文件所有的类都要指定全路径。
auto-import = “true”。
——默认为true, 在写hql的时候自动导入包名。常用。
——false时, 再写hql的时候必须要写上类的全名。

4.4.2 class标签

class 映射某一个对象的(一般情况,一个对象写一个映射文件,即一个class节点)
常用的属性
name= “指定要映射的对象的类”。
table = “指定对象对应的表”。若没有指定,默认与对象名称一样。

4.4.3 property标签

property是普通属性的映射,即JavaBean普通的成员变量属性就使用property来描述!
常用的属性
name= " 指定对象的属性名称"。
column = “指定对象属性对应的表的字段名称”。若不写,默认与对象属性一致。
length = " 指定字符的长度"。默认为255。
type = “指定映射表的字段的类型”。若不指定,会匹配属性的类型。
——java类型: 必须写全名【例:java.lang.String】
——hibernate类型: 直接写类型,都是小写
注意:如果列名称为数据库关键字,需要用反引号或改列名。通常情况下,禁止使用关键字作为列名。

4.4.4 id标签

id是主键映射
常用的属性
name= " 指定对象的属性名"。
column = “指定对象属性对应的表的字段名称”。

< id>节点下还有子节点< generator class=“主键的自动生成策略”/>

主键的自动生成策略含义
identity自增长(mysql,db2)
sequence自增长(序列), oracle中自增长是以序列方法实现。
native自增长【会根据底层数据库自增长的方式选择identity或sequence】。
increment自增长(会有并发访问的问题,一般在服务器集群环境使用会存在问题。)。
assigned指定主键生成策略为手动指定主键的值
uuid指定主键生成策略为UUID生成的值
foreign外键的方式

4.4.5 composite-id标签

主键一般分为两种:
——单列主键。只有一个主键。
——多列复合主键。有多个主键。
需求:使用username和password作为复合主键。
第一步:将username和password抽取成一个类。
CompositeKey.java

// 必须实现Serializable接口
public class CompositeKey  implements Serializable{
    private String username;
    private String password;
	//各种setter和getter方法 
}

第二步:指定一个变量来维护这个主键对象。
User2.java

public class User2 {
    //在User对象中维护这个主键对象
    private CompositeKey key;
    private String cellphone;
   //各种setter和getter方法 
}

第三步:实体映射文件
User2.hbm.xml

<?xml version="1.0"?>
<!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.my.entity">
    <class name="User2"  table="user2">
        <id name="id" column="id">
            <generator class="native"/>
        </id>
        <composite-id>
            <key-property name="username" type="string" column="username"/>
            <key-property name="password" type="string" column="password"/>
        </composite-id> 
        <property name="cellphone" column="cellphone"/>
    </class>
</hibernate-mapping>

第四步:测试

public static void main(String[] args) {
	//获取加载配置管理类
	Configuration configuration = new Configuration();
	//加载User的映射文件!
	configuration.configure().addClass(User2.class);
	//创建Session工厂对象
	SessionFactory factory = configuration.buildSessionFactory();
	//得到Session对象
	Session session = factory.openSession();
	//使用Hibernate操作数据库,都要开启事务,得到事务对象
	Transaction transaction = session.getTransaction();
	//开启事务
	transaction.begin();
	//创建对象
	User2 user2 = new User2();
	CompositeKey compositeKey = new CompositeKey();
	compositeKey.setUsername("123");
	compositeKey.setPassword("123");
	user2.setCellphone("111");
	user2.setKey(compositeKey);
	//添加User2对象到数据库
	session.save(user2);
	//提交事务
	transaction.commit();
	//关闭Session
	session.close();
}

五、Hibernate执行流程图

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录<br><br>前言<br>1. 翻译说明<br>1. 在Tomcat中快速上手<br>1.1. 开始Hibernate之旅<br>1.2. 第一个可持久化类<br>1.3. 映射cat<br>1.4. 与猫同乐<br>1.5. 结语<br>2. 体系结构<br>2.1. 总览<br>2.2. JMX集成<br>2.3. JCA支持<br>3. SessionFactory配置<br>3.1. 可编程配置方式<br>3.2. 获取SessionFactory<br>3.3. 用户自行提供JDBC连接<br>3.4. Hibernate提供的JDBC连接<br>3.5. 可选配置属性<br>3.5.1. SQL Dialects SQL 方言<br>3.5.2. 外连接抓取(Outer Join Fetching )<br>3.5.3. 二进制流<br>3.5.4. 自定义CacheProvider<br>3.5.5. 事务策略配置<br>3.5.6. 绑定SessionFactory到JNDI<br>3.5.7. 查询语言替换 <br>3.6. Logging<br>3.7. 实现NamingStrategy(命名策略)<br>3.8. XML配置文件<br>4. 持久化类(Persistent Classes)<br>4.1. POJO简单示例<br>4.1.1. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators)<br>4.1.2. 实现一个默认的构造方法(constructor)<br>4.1.3. 提供一个标识属性(identifier property)(可选) <br>4.1.4. 建议使用不是final的类 (可选)<br>4.2. 实现继承(Inheritance)<br>4.3. 实现equals()和hashCode()<br>4.4. 持久化生命周期(Lifecycle)中的回调(Callbacks)<br>4.5. 合法性检查(Validatable)回调<br>4.6. XDoclet标记示例<br>5. O/R Mapping基础<br>5.1. 映射声明(Mapping declaration)<br>5.1.1. Doctype<br>5.1.2. hibernate-mapping<br>5.1.3. class<br>5.1.4. id<br>5.1.4.1. generator<br>5.1.4.2. 高/低位算法(Hi/Lo Algorithm)<br>5.1.4.3. UUID算法(UUID Algorithm )<br>5.1.4.4. 标识字段和序列(Identity columns and Sequences)<br>5.1.4.5. 程序分配的标识符(Assigned Identifiers)<br>5.1.5. composite-id 联合ID<br>5.1.6. 识别器(discriminator)<br>5.1.7. 版本(version)(可选)<br>5.1.8. 时间戳(timestamp )(可选)<br>5.1.9. property<br>5.1.10. 多对一(many-to-one)<br>5.1.11. 一对一<br>5.1.12. 组件(component), 动态组件(dynamic-component)<br>5.1.13. 子类(subclass)<br>5.1.14. 连接的子类(joined-subclass)<br>5.1.15. map, set, list, bag<br>5.1.16. 引用(import)<br>5.2. Hibernate 的类型<br>5.2.1. 实体(Entities)和值(values)<br>5.2.2. 基本值类型<br>5.2.3. 持久化枚举(Persistent enum)类型<br>5.2.4. 自定义值类型<br>5.2.5. 映射到"任意"(any)类型<br>5.3. SQL中引号包围的标识符<br>5.4. 映射文件的模块化(Modular mapping files)<br>6. 集合类(Collections)映射<br>6.1. 持久化集合类(Persistent Collections)<br>6.2. 映射集合(Mapping a Collection)<br>6.3. 值集合和多对多关联(Collections of Values and Many-To-Many Associations)<br>6.4. 一对多关联(One-To-Many Associations)<br>6.5. 延迟初始化(延迟加载)(Lazy Initialization)<br>6.6. 集合排序(Sorted Collections)<br>6.7. 使用<idbag><br>6.8. 双向关联(Bidirectional Associations)<br>6.9. 三重关联(Ternary Associations)<br>6.10. 异类关联(Heterogeneous Associations)<br>6.11. 集合例子(Collection example)<br>7. 组件(Component)映射<br>7.1. 依赖对象(Dependent objects)<br>7.2. 在集合中出现的依赖对象<br>7.3. 组件作为Map的索引(Components as Map indices )<br>7.4. 组件作为联合标识符(Components as composite identifiers)<br>7.5. 动态组件 (Dynamic components)<br>8. 继承映射(Inheritance Mappings)<br>8.1. 三种策略<br>8.2. 限制<br>9. 操作持久化数据(Manipulating Persistent Data)<br>9.1. 创建一个持久化对象<br>9.2. 装载对象<br>9.3. Querying<br>9.3.1. 标量查询(Scalar query)<br>9.3.2. 查询接口(Query interface)<br>9.3.3. 可滚动迭代(Scrollable iteration)<br>9.3.4. 过滤集合类(Filtering collections)<br>9.3.5. 条件查询<br>9.3.6. 使用本地SQL的查询<br>9.4. 更新对象<br>9.4.1. 在同一Session中更新<br>9.4.2. 更新从session脱离的对象<br>9.4.3. 把与Session脱离的对象重新绑定<br>9.5. 删除持久化对象<br>9.6. 同步(Flush)<br>9.7. 结束一个Session<br>9.7.1. 同步(Flush) Session<br>9.7.2. 提交数据库事务<br>9.7.3. 关闭Session<br>9.7.4. 处理异常<br>9.8. 生命周期和对象图(Lifecyles and object graphs)<br>9.9. 拦截器(Interceptors)<br>9.10. 元数据(Metadata) API<br>10. 事务和并行(Transactions And Concurrency)<br>10.1. 配置,会话和工厂(Configurations, Sessions and Factories)<br>10.2. 线程和连接(Threads and connections)<br>10.3. 考虑对象辨别<br>10.4. 乐观并发控制(Optimistic concurrency control)<br>10.4.1. 使用长生命周期带有自动版本化的会话<br>10.4.2. 使用带有自动版本化的多个会话<br>10.4.3. 应用程序自己进行版本检查<br>10.5. 会话断开连接(Session disconnection)<br>10.6. 悲观锁定(Pessimistic Locking)<br>11. Hibernate查询语言(Query Language), 即HQL<br>11.1. 大小写敏感性(Case Sensitivity)<br>11.2. from 子句<br>11.3. 联合(Associations)和连接(joins)<br>11.4. select子句<br>11.5. 统计函数(Aggregate functions)<br>11.6. 多态(polymorphism)查询<br>11.7. where子句<br>11.8. 表达式(Expressions)<br>11.9. order by 子句<br>11.10. group by 子句<br>11.11. 子查询<br>11.12. HQL示例<br>11.13. 提示和技巧(Tips & Tricks)<br>12. 条件查询(Criteria Query)<br>12.1. 创建一个Criteria实例<br>12.2. 缩小结果集范围<br>12.3. 对结果排序<br>12.4. 关联(Associations)<br>12.5. 动态关联对象获取(Dynamic association fetching)<br>12.6. 根据示例查询(Example queries)<br>13. 原生SQL查询<br>13.1. 创建一个基于SQL的Query<br>13.2. 别名和属性引用<br>13.3. 为SQL查询命名<br>14. 性能提升(Improving performance)<br>14.1. 理解集合的性能<br>14.1.1. 分类<br>14.1.2. Lists, maps 和sets用于更新效率最高<br>14.1.3. Bag和list是反向集合类中效率最高的<br>14.1.4. 一次性删除(One shot delete)<br>14.2. 用于延迟装载的代理<br>14.3. 第二层缓存(The Second Level Cache)s<br>14.3.1. 对映射(Mapping)缓冲<br>14.3.2. 策略:只读缓存<br>14.3.3. 策略:读/写缓存<br>14.3.4. 策略:不严格的读/写缓存<br>14.3.5. 策略:事务缓存(transactional)<br>14.4. 管理Session缓存<br>14.5. 查询缓存(Query Cache)<br>15. 工具箱指南<br>15.1. Schema 生成器(Schema Generation)<br>15.1.1. 对schema定制化(Customizing the schema)<br>15.1.2. 运行该工具<br>15.1.3. 属性(Properties)<br>15.1.4. 使用Ant(Using Ant)<br>15.1.5. 对schema的增量更新(Incremental schema updates)<br>15.1.6. 用Ant来增量更新schema(Using Ant for incremental schema updates)<br>15.2. 代码生成(Code Generation)<br>15.2.1. 配置文件(可选)<br>15.2.2. meta属性<br>15.2.3. 基本的finder生成器(Basic finder generator)<br>15.2.4. 基于Velocity的渲染器/生成器(Velocity based renderer/generator)<br>15.3. 映射文件生成器(Mapping File Generation)<br>15.3.1. 运行此工具<br>16. 示例:父子关系(Parent Child Relationships)<br>16.1. 关于collections<br>16.2. 双向的一对多关系(Bidirectional one-to-many)<br>16.3. 级联生命周期(Cascading lifecycle)<br>16.4. 级联更新(Using cascading update())<br>16.5. 结论<br>17. 示例:Weblog 应用程序<br>17.1. 持久化类<br>17.2. Hibernate 映射<br>17.3. Hibernate 代码<br>18. 示例:不同的映射<br>18.1. 雇员/雇主(Employer/Employee)<br>18.2. 作者/著作(Author/Work)<br>18.3. 客户/订单/产品(Customer/Order/Product)<br>19. 最佳实践(Best Practices)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值