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).hibernatejavabeans风格的属性实行持久化

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",那么就不会再数据库中生成父类对应的表了,父类就只起到一个抽象的作用了。

原文地址:https://www.cnblogs.com/mxf97826/p/8708150.html