Hibernate笔记

来源:互联网 发布:手机网络渗透 编辑:程序博客网 时间:2024/05/01 05:30

hibernate.cfg.xml常用配置

 

connection.username

数据库用户名

connection.password

数据库密码

connection.url

数据库地址

connection.driver_class

jdbc驱动

connection.dialect

配置Hibernate数据库方言,针对方言对不同数据库进行优化

hibernate.show_sql

是否把hibernate运行时的sql语句输出到控制台

hibernate.format_sql

输出到控制台的sql语句是否进行排版

hbm2ddl.auto

指定数据库表的生成策略(create、update、creat-drop/validate)

 

 

 

创建持久化类

需要遵循javabean设计原则

1.类为public

2.成员为private

3.提供公有的不带参数的构造方法

4.提供getter和setter

 

创建对象关系映射文件

生成hbm.xml文件,并在配置文件中增加<mapping>标签

<mapping resource=”Student.hbm.xml”/>

 

 

创建session

//创建配置对象

Configuration config = new Configuration().configure();

//创建会话工厂对象

SessionFactory sessionFactory = config.buildSessionFactory();

//打开会话

Session session = sessionFactory.openSession();

//开启事务

Transaction transaction = session.beginTransaction();

 

事务Transaction

Hibernate对数据库的操作都是封装在事务中,并且默认是非自动提交的方式。用session保存对象是,如果不开启事务并手工提交事务,对象并不会真正保存到数据库中。

 

如果想让Hibernate自动提交事务,必须调用session对象的到doWork()方法,获取jdbc的connection后,设置为自动提交模式。(不推荐)

 

 

Session

获得session对象

getCurrentSession();

openSession();

如果使用getCurrentSession(),需要在hibernate.cfg.xml文档中进行配置

如果是本地事务(jdbc事务)

 <property name="hibernate.current_session_context_class">thread</property>

如果是全局事务(jta事务)

<property name="hibernate.current_session_context_class">jta</property>

 

两种方法的区别

1.getCurrentSession在提交事务或回滚之后会自动关闭,而openSession需要手动关闭。如果使用openSession而没有手动关闭,多次后会导致连接池溢出。

2.openSession每次创建新的session对象,getCurrentSession使用现有的Session对象。

 

主键生成策略

hbm配置文档中<id>标签标示主键,其中有generator标签表示主键生成策略

<generator class="assigned" />

表示由Java程序负责生成

<generator class="native" />

由数据库自动生成标识符,如果是mysql就是自动增长

 

组件属性

实体类中的某个属性是用户自定义的类的对象

该类必须也满足javabean设计原则

hbm文档中加入<component>标签

 

Address类的对象address是Students的属性,其又有number,address三个成员变量,Student类的hbm文档中加入

<component name="address" class="hibernate.Address">

         <property name="number" column="NUMBER"/>

         <property name="address" column="ADDRESS"/>

</component>

数据库表中增加number和address字段

 

增删改查

增:sava(Object o)

删:delete(Object o)

改:update(Object o)

查:get、load(查询单个记录)

get(Student.class,key),load(Student.class,key)

get与load的区别

在不考虑缓存的情况下,get方法会在调用之后立即向数据库发出sql语句,返回持久化对象。load方法会返回一个代理对象,只保存了实体对象的id,直到使用对象的非主键属性是才会发出sql语句。

当查询对象不存在时,get方法返回null,load方法抛出异常org.hibernate.ObjectNotFoundException

 

一对多映射

通过在一方持有多方的集合实现,即在一方使用<set>元素表示持有多方一端的对象