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>元素表示持有多方一端的对象