hibernate总结
Hibernate 数据库相关配置项
属性名 作用
Hibernate.connection.driver_class JDBC驱动类
Hibernate.connection.url JDBC URL
Hibernate.connection.username 数据库用户名
Hibernate.connection.password 数据库用户密码
Hibernate.show_sql 设置控制台sql输出
hibernate方言(Dialect)类名--可以让hibernate使用某些特定的数据库平台的特性
Hibernate.dialect 取值:完整的方言类名
Configuration 配置
configure()
configure(String resource)
addResource(Strng resource)倒入一个指定位置的映射文件
addClass(Class class)导入与指定类同一包中的以类名为前缀,后缀为.hbm.xml的映射文件
buildSessionFactory()
Sessionfactory Session工厂
openSession();
openCurrentSession();
close();
Session 很重要的一个对象
操作对象的方法:
save(Object);
update(Object);
delete(Object);
查询的方法:
createQuery(String)-->Query
createCriteria(String );
管理事务的方法:
beginTransaction()-->Transaction();
getTransaction() -->Transaction();获得当前关联的事务
Transaction 事务
commit()提交事务
rollback()事务回滚
Query 查询
list()查询一个结果集合
uniqueResult();查询一个唯一的结果,如果没有结果,则返回null,如果结果有多个,就抛出异常
Hibernate主配置文件
1.配置的key前面的hibernate,前缀可以有,也可以没有。如hibernate,dialect或者dialect都可以
2.按作用可以分为三类:
1.数据库信息
a) <property.../>
方言,jdbcurl,驱动,用户名,密码
2.导入映射文件
<mapping...>
3.其他配置
<property...>
show_sql 显示生成的sql语句
Format_sql 格式化生成的sql语句
生成表结构的两种方式:
1,hbm2ddl.auto
2,使用SchemaExport工具类
注意:只能建表,不能建库
<create是先删除后创建
update如果表不存在就创建,不一样就更新,一样就不改变
create-drop 初始化时创建表SessionFactory执行close时删除表
validate验证表结构是否一致,如果不一致就会抛出异常
<property name="hbm2ddl.auto">create</property>
<property name="hbm2ddl.auto">update</property>
对持久化对象/实体的要求
1.提供一个无参的构造器.使hibernate可以使用Constructor.newInstance()来实例化持久化类
2.提供一个标识属性(identifier property),通常映射为数据库表的主键字段,如果没有该属性,一些功能将不起作用,如:Session.saveOrUpdate().
3.为持久化类的字段声明访问方法(get/set).hibernate对javabeans风格的属性实行持久化
4.使用非final类,在运行时生成代理是hibernate的一个重要的功能,如果持久化类没有实现任何接口,hibernate使用CGLIB生成代理,如果使用的是final类,则无法生成CGLIB代理
5.重写equals()和hascode()方法,如果需要持久化类的实例放到set中(当需要进行关联映射),则应该重写这两个方法
添加环境:
配置jar包
配置文件
Hibernate.cfg.xml
xxx.hbm.xml
使用hibernate实现增删查改:
//----模板代码
Configuration cfg=new Configuration();
SessionFactory sessionFactory=cfg.buildSessionFactory();
Session session=sessionFactory.openSession();
Try{
Transaction tx=session.beginTransaction();
//
tx.commit();
}catch(Exception e){
tx.rollback();
throw e;}
finally{
session.close();}
------操作
Session中的操作方法:
save(Object) --->insert into
update(Object)--->update...
SaveOrUpdate(Object)--->
delete(Object) --->delete...
get(Class,id) --->select...
createQuery(hql)
主配置文件
1.数据库信息
方言,jdbcurl,驱动,用户名,密码
2.导入映射文件
3.其它配置 show_sql=true;
Hbm2ddl.auto=uodate;
映射配置
映射基础
类----类
属性---列
映射普通属性
name type column length not-null.......
映射主键
主键生成策略:native ,uuid
一、集合映射。
类型 Java中声明 映射元素
---------------------------------
Set Set <set>
List List <list>
Map Map <map>
数组 ...[] <array>
Bag List/Collection <bag>
---------------
要说明的信息有:
1,只要有集合,就一定有集合表。
2,集合外键。
3,集合元素。
4,对于List和数组,还需要多一个索引列。
5,对于Map,还需要多一个key列。
值类型的集合。
实体类型的集合
二、关联关系映射(要说明的信息有什么)。
一对多:
1,属性名
2,集合外键
3,关联的实体类型(one-to-many class="")
多对一:
1,属性名
2,外键列名
3,关联的实体类型
多对多:
1,属性名
2,中间表
3,集合外键:引用当前对象表主键值的那外外键
4,关联的实体类型
5,另一个外键:引用关联实体表主键的那个外键。
一些重要的属性:
inverse:
是否放弃维护关联关系。
默认是false,表示可以维护。
实体类型的集合映射中可以使用(一对多、多对多)。
sort:
在内存中排序(类似于TreeSet)
默认为unsorted,即不排序。
在无序的集合映射中可以使用。
order-by:
使用数据库排序,即在SQL中增加orderby子句(类似于LinkedHashSet)。
默认不排序,这里指定的是sql语句中的orderby子句。
在无序的集合映射中可以使用。
cascade:
级联。
默认为none。
在所有的关联关系映射中可以使用。
常用的值:all, save-update, delete, none.
对象的状态:
临时状态:
与数据库没有对应,跟Session没有关联。
一般是新new出的对象。
持久化状态:
对象在Session的管理之中,最终会有对应的数据库记录。
特点:
1,有OID
2,对对象的修改会同步到数据库。
游离状态:
数据库中有对应记录,但对象不在Session管理之中。
修改此状态对象时数据库不会有变化。
删除状态:
执行了delete()后的对象。
三、Session中的方法。
对象的状态:
Session中 数库中
-----------------------
临时 无 无
持久化 有 最终会有
游离 无 有
删除 调用了delete()方法后
1,操作实体对象的
save()
update()
saveOrUpdate()
delete()
2,操作缓存的
clear() 清空Session缓存,不会执行sql语句。
evict()
flush() 马上执行sql语句,不会清楚Session缓存
3,查询实体对象的
get()
load()
createQuery()
createCriteria()
加载方式 返回值 如果数据不存在
---------------------------------------------------------
get 立即加载 真实对象或null 返回null
load 延迟加载 代理对象 抛异常
Hibernate继承总结:
subclass标签就是为子类嵌入父类的表中而设计的,而且要指定鉴别器,即用subclass一定要有判断类型的一个列,鉴别器指定记录属于哪个类型。但是subclass也提供了为子类设置单独的表的功能,即join标签。但是不管是内嵌表还是外部表,都得指定鉴别器。
joined-subclass标签,提供的功能是只能为子类设定外部表,而且没有鉴别器,即子类一张表,父类一张表,子类以父类的主键为外键。父类对应的表中,没有判断类型的列。
注意:这两个标签不能混用,若是只想要内嵌表,或者是既想要有内嵌表,又想要外部表,又或者是只想要外部表,那么只能使用subclass标签,需要注意的是,不论哪种方式,都要指定鉴别器,即父类对应的表中,一定有一个判断类型的列;而若是只想要外部表,又不想在父类对应的表中,要那个判断类型的列,那么只能使用join-subclass
union-subclass是将父类中的属性,添加到子类对应的表中去了。包括父类中的外键。union-class和前两个的区别就在于外键的不同,前两个标签,如果子类有单独对应的表的话,这个表的外键是其父类中的主键,而使用union-class,子类对应的表中的外键则和父类的外键是一样的,因为子类把父类继承的属性,也加到了自己的表当中。这样子类和父类的地位就相当了。不过这不是一种好的理解方式。如果是这样的话,那么就可以把父类设为抽象的类,并且在映射文件中,把父类设置为abstract="true",那么就不会再数据库中生成父类对应的表了,父类就只起到一个抽象的作用了。