Hibernate基础知识详解<hibernate-mapping>
<class name="*.*.*" table="t_customer" catalog="***">
<id name="id" column="c_id">
<generator class="identity"/>
</id>
<property name="name" column="c_name" length="20"/>江山永固
<t name="orders" inver="fal" cascade="save-update">
<key column="c_customer_id"/>
</t>
</class>
</hibernate-mapping>
(1)统⼀声明包名,这样在<class>中就不需要写类的全名。
(2)关于<class>标签配置
name 属性:类的全名称
table 表的名称,可以省略,这时表的名称就与类名⼀致
catalog 属性:数据库名称可以省略.如果省略,参考核⼼配置⽂件中 url 路径中的库名称
(3)关于<id>标签,<id>是⽤于建⽴类中的属性与表中的主键映射。
name 类中的属性名称
column 表中的主键名称 column 它也可以省略,这时列名就与类中属性名称⼀致
length 字段长度
type 属性指定类型
<generator>它主要是描述主键⽣成策略。
(4)关于<property>标签 ,是描述类中属性与表中⾮主键的映射关系。
2.核⼼配置⽂件
主要包含了连接数据库相关信息,hibernate相关配置等。位置:在项⽬根⽬录下创建⼀个。名称:l 根据hibernate.properties⽂件下的信息可以配置
<hibernate-configuration>
<ssion-factory>
<!-- 配置关于数据库连接的四个项 driverClass url urname password -->
戏曲美<property name="tion.driver_class"&sql.jdbc.Driver</property>
惊慌失措的意思<property name="tion.url">jdbc:mysql:///**</property>
<property name="tion.urname">***</property>
<property name="tion.password">***</property>
<!-- 设置连接提供者 -->
<property name="tion.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<!-- c3p0连接池的配置 -->
<property name="hibernate.c3p0.max_size">20</property><!-- 最⼤连接池 -->
<property name="hibernate.c3p0.min_size">5</property><!-- 最⼩连接数 -->
<property name="hibernate.c3p0.timeout">120</property><!-- 超时 -->
<property name="hibernate.c3p0.idle_test_period">3000</property><!-- 空闲连接 -->
<!-- 可以将向数据库发送的sql显⽰出来 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化sql -->
<property name="hibernate.format_sql">true</property>
<!-- hibernate的⽅⾔ -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- ⾃动创建表 -->
<property name="hibernate.hbm2ddl.auto">create</property>
<!-- ⽤于设置事务提交⽅式 -->
<property name="tion.autocommit">fal</property>
<!-- 配置hibernate的映射⽂件所在位置 -->
<mapping resource=".././*.l"/>
</ssion-factory>
</hibernate-configuration>超卖
注意:⽆论是映射⽂件还是核⼼配置⽂件,都要有约束在xml⽂件中,已3.0.dtd为例:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"www.hibernate/dtd/hibernate-configuration-3.0.dtd">
位置是:hibernate的jar包下的\project\etc\hibernate.properties
四、Hibernate⼯作原理:
脱机状态1.通过 Configuration().configure(); 读取并解析 l 配置⽂件。
2.由l中的<mappingresource="xx/xx/l"/> 读取解析映射信息。
3.通过 config.buildSessionFactory(); 得到 ssionFactory。
4.ssionFactory.openSession(); 得到 ssion。
5.ssion.beginTransaction(); 开启事务。
Transaction().commit(); 提交事务
7.关闭 ssion;
五、Hibernate持久化类与主键⽣成策略
在 l 中可以设置的主键⽣成策略如下:
主键⽣成器描述
increment 代理主键。由 hibernate 维护⼀个变量,每次⽣成主键时⾃动以递增。问题:如果有多个应⽤访问⼀个数据库,由于每个应⽤维护⾃⼰ 的主键。此时主键可能冲突。建议不采⽤。 identity 代理主键。由底层数据库⽣成表识符。条件是数据库⽀持⾃动增长数据类型。⽐如:mysql 的⾃增主键,oracle 不⽀持主键⾃动⽣成。 如果数据库⽀持⾃增建议采⽤。
quence 代理主键。Hibernate 根据底层数据库序列⽣成标识符。条件是数据库⽀持序列。⽐如 oracle 的序列。如果数据库⽀持序列建议采⽤。
native 代理主键。根据底层数据库对⾃动来选择 identity、quence、hilo由于⽣成主键策略的控制权由hibernate 控制,所以不建议采⽤。
uuid 代理主键。Hibernate 采⽤ 128 位的 UUID 算法来⽣成标识符。该算法能够在⽹络环境中⽣成唯⼀的字符串标识符。此策略可以保证⽣ 成主键的
唯⼀性,并且提供了最好的数据库插⼊性能和数据库平台的⽆关性。建议采⽤。
assigned ⾃然主键。由 java 程序负责⽣成标识符。不建议采⽤。
六、Hibernate持久化对象状态
1. 瞬时态:也叫做临时态或⾃由态,它⼀般指我们new出来的对象,它不存在OID,与hibernate ssion⽆关联,在数据库中也⽆记录。它使⽤手机太卡怎么解决
完成后,会被jvm直接回收掉,它只是⽤于信息携带。
简单说:⽆OID与数据库中的信息⽆关联,不在 ssion 管理范围内。
2. 持久态:在 hibernate ssion 管理范围内,它具有持久化标识OID它的特点,在事务未提交前⼀直是持久态,当它发⽣改变
时,hibernate
是可以检测到的。
简单说:有OID 由ssion管理,在数据库中有可能有,也有可有没有。
3. 托管态:也叫做游离态或离线态,它是指持久态对象失去了与ssion的关联,托管态对象它存在OID,在数据库中有可能存在,也有可能不
存在。对于托管态对象,它发⽣改变时hibernet不能检测到。
金色头发图片
七、Hibernate注解开发
1.PO类注解开发
@Entity 声明⼀个实体
@Table 来描述类与表对应
@Id 来声明⼀个主键
@GenerateValue ⽤它来声明⼀个主键⽣成策略
默认情况下相当于native,可以选择的主键⽣成策略 AUTO IDENTITY SEQUENCE
@Column 来定义列
注意:对于 PO 类中所有属性,如果你不写注解,默认情况下也会在表中⽣成对应的列。列的名称就是属性的名称
@Temporal 来声明⽇期类型
TemporalType.DATA 只有年⽉⽇
TemporalType.TIME 只有⼩时分钟秒
TemporalType.TIMESTAMP 有年⽉⽇⼩时分钟秒
2.⼀对多(多对⼀)
@OneToMany
@ManyToOne
3.级联
@Cascade
⼋、Hibernate检索⽅式概述
Hibernate提供以下5种检索对象⽅式:
1 导航对象图检索⽅式,根据已加载的对象导航到其它对象
2.OID检索⽅式,按照对象的OID来检索对象
3.HQL检索⽅式,使⽤⾯向对象的HQL查询语⾔
4.QBC检索⽅式,使⽤QBC(Query by Criteria)API来检索对象,这种API封装基于字符串形式的查询语句,提供了更加⾯向对象的查询接⼝
5.本地SQL检索⽅式,使⽤本地数据库的SQL查询语句
九、Hibernate事务管理
1.Hibernate事务管理级别
l配置事务管理
<property name="tion.isolation">4</property>
1 代表的事务隔离级别为 READ UNCOMMITTED
2 代表的事务隔离级别为 READ COMMITTED
4 代表的事务隔离级别为 REPEATABLE READ
8 代表的事务隔离级别为 SERIALIZABLE
EAD_UNCOMMITED 读取未提交,它引发所有的隔离问题
READ_COMMITTED 读已提交,阻⽌脏读,可能发⽣不可重复读与虚读.
血流漂杵REPEATABLE_READ 重复读阻⽌脏读,不可重复读可能发⽣虚读
SERIALIZABLE 串⾏化解决所有问题不允许两个事务,同时操作⼀个⽬标数据。(效率低下) ORACLE 默认的是事务隔离级别 READ_COMMITTED
MYSQL 默认的事务隔离级别 REPEATABLE_READ
2. Hibernate中ssion管理
Hibernate提供了三种管理ssion的⽅式:
(1)Session 对象的⽣命周期与本地线程绑定(ThreadLocal)
(2)Session 对象的⽣命周期与 JTA 事务绑定(分布式事务管理)
(3)Hibernate 委托程序来管理 Session 的⽣命周期