标签:style blog http io color ar os 使用 java
在没有学习Hibernate之前,我们一直都是用jdbc来连接数据库和操纵数据库。所以在刚接触Hibernate时,我们都有一个疑问,为什么要学Hibernate,jdbc不是挺好的吗?那么接下来就来讲讲jdbc的优缺点与为什么要用Hibernate吧。
JDBC
长处:
直接底层操作,提供了非常easy、便捷的訪问数据库的方法,跨平台性比較强。灵活性比較强,能够写非常复杂的SQL语句。
缺点:
- 由于JAVA时面向对象的,JDBC没有做到使数据可以面向对象的编程,是程序猿的是靠仍然停留在SQL语句上。
- 操作比較频繁,非常多代码须要反复写非常多次。
- 假设遇到批量操作,频繁与数据库进行交互,easy造成效率的下降。
为什么要用Hibernate
- Hibernate实现了面向对象的数据库编程
- Hibernate比起JDBC,在代码的书写上比較简单化
- Hibernate提出了缓存机制,这样能够使訪问数据的效率提高非常多
Hibernate项目所需的lib包
Hibernate配置文件里name里面的一些信息
Hibernate.connection.url 表示要链接的数据库地址
Hibernate.connection.driver_class 表示要链接的数据库的驱动类
Hibernate.connection.username 要连接的数据库的用户名
Hibernate.connection.password 要连接的数据库的密码
Hibernate.dialect 表示要使用的数据库的类型
org.hibernate.dialect.MySQL5Dialect mysql数据库
org.hibernate.dialect.Oracle9Dialect oracle数据库
org.hibernate.dialect.SQLServerDialect SQLServer数据库
hibernate.hbm2ddl.auto
validate:载入hibernate时验证创建表结构
update:载入hibernate时自己主动更新数据库结构,假设表存在不用创建,假设不存在就创建。
create:每一次载入hibernate时都创建表结构
create-drop:载入hibernate时创建,退出时删除
接下来具体介绍Hibernate
Hibernate的长处:
对象关系映射(Object/Relation Mapping)提供了概念性的、易于理解的模型化数据的方法。ORM方法论基于三个核心原则: 简单:以最主要的形式建模数据。 传达性:数据库结构被不论什么人都能理解的语言文档化。
精确性:基于数据模型创建正确标准化了的结构。 典型地,建模者通过收集来自那些熟悉应用程序但不熟练的数据建模者的人的信息开发信息模型。建模者必须可以用非技术企业专家可以理解的术语在概念层次上与数据结构进行通讯。建模者也必须能以简单的单元分析信息,对样本数据进行处理。ORM专门被设计为改进这样的联系。
Hibernate的主键生成机制:
表示符生成器 |
描写叙述 |
Increment |
由hibernate自己主动以递增的方式生成表识符,每次增量为1 |
Identity |
由底层数据库生成表识符。条件是数据库支持自己主动增长数据类型。 |
Sequence |
Hibernate依据底层数据库序列生成标识符。条件是数据库支持序列。 |
Native |
依据底层数据库对自己主动生成表示符的能力来选择identity、sequence、hilo |
Uuid.hex |
Hibernate採用128位的UUID算法来生成标识符。该算法 可以在网络环境中生成唯一的字符串标识符,这样的策略并不流行,由于字符串类型的主键比整数类型的主键占用很多其它的数据库空间。 假设主键用字符类型,而且不代表不论什么含义。 |
assigned |
适用于自然主键。由java程序负责生成标识符。不能把setID()方法声明为 Private的。尽量避免使用自然主键。 |
持久化对象有3种状态:
Session 的特定方法能使对象从一个状态转换到还有一个状态
Session使用下面方法能够使持久化对象转变成游离对象:
程序代码 |
生命周期 |
状态 |
tx = session.beginTransaction(); Customer c = new Customer); |
開始生命周期 |
暂时状态 |
Session.save(c) |
处于生命周期中 |
转变为持久化状态 |
Long id=c.getId(); c = null; Customer c2 = (Customer)session.load(Customer.class,id); tx.commit(); |
处于生命周期中 |
处于持久化状态 |
session.close(); |
处于生命周期中 |
转变为游离态 |
c2.getName(); |
处于生命周期中 |
处于游离态 |
c2 = null; |
结束生命周期 |
结束生命周期 |
对象状态的总结
saveOrUpdate:
该方法同一时候包括save和update方法,假设參数是暂时对象就用save方
法,假设是游离对象就用update方法,假设是持久化对象就直接返回。
假设參数是暂时对象就用save方法
假设是游离对象就用update方法
假设是持久化对象就直接返回,不运行操作
只建立从Order到Customer的多对一关联,即只在Order类中定义customer属性。或者只建立从Customer到Order的一对多关联,即只Customer类中定义orders集合。
单向 n-1 关联仅仅需从 n 的一端能够訪问 1 的一端
域模型: 从 Order 到 Customer 的多对一单向关联须要在Order 类中定义一个 Customer 属性, 而在 Customer 类中无需定义存放 Order 对象的集合属性
关系数据模型:ORDERS 表中的 CUSTOMER_ID 參照 CUSTOMER 表的主键
Hibernate 使用 <many-to-one> 元素来映射多对一关联关系
保存操作
级联保存和更新
- 当hibernate持久化一个暂时对象时,在默认情况下,他不会自己主动持久化所关联的其它暂时对象,会抛出TransientObjectException.假设设定many-to-one元素的cascade属性为save-update的话,可实现自己主动持久化所关联的对象。
双向 1-n 与 双向 n-1 是全然同样的两种情形
双向 1-n 须要在 1 的一端能够訪问 n 的一端, 反之依旧.
从 Order 到 Customer 的多对一单向关联须要在Order 类中定义一个 Customer 属性, 而在 Customer 类中需定义存放 Order 对象的集合属性
ORDERS 表中的 CUSTOMER_ID 參照 CUSTOMER 表的主键
Hibernate使用set元素来映射一对多关联关系
当hibernate持久化一个暂时对象时,在默认情况下,他不会自己主动持久化所关联的其它暂时对象,会抛出TransientObjectException.假设设定set元素的cascade属性为save-update的话,可实现自己主动持久化所关联的对象。
在hibernate中通过对 inverse 属性的值决定是由双向关联的哪一方来维护表和表之间的关系. inverse=false 的为主动方,inverse=true 的为被动方, 由主动方负责维护关联关系
在没有设置 inverse=true 的情况下,父子两边都维护父子关系
在 1-n 关系中,将 n 方设为主控方将有助于性能改善
在 1-N 关系中,若将 1 方设为主控方 会额外多出 update 语句
在一的一方设值inverse为TRUE表明一的一方不维护其关系,这样就会发出一条update语句,这样效率也就提高了。
1.在映射一对多的双向关联关系时,应该在one方把inverse属性设为true,
这能够提高性能。
2.在建立两个对象的关联时,应该同一时候改动关联两端的对应属性:
customer.getOrders().add(order);
order.setCustomer(customer);
这样才会使程序更加健壮,提高业务逻辑层的独立性,使业务逻辑层的程序代码
不受Hibernate实现类的影响。同理,当删除双向关联的关系时,也应该改动
关联两端的对象的对应属性:
Customer.getOrders().remove(order);
Order.setCustomer(null);
级联删除
<set> 元素有一个 order-by 属性, 假设设置了该属性, 当 Hibernate 通过 select 语句到数据库中检索集合对象时, 利用 order by 子句进行排序
标签:style blog http io color ar os 使用 java
原文地址:http://www.cnblogs.com/mengfanrong/p/4081773.html