Hibernate初探之单表映射
本文乃是我学习hibernate时所做笔记,不足之处,欢迎指正
主要内容:
- hibernate.cfg.xml常用配置
- session简介
- transaction简介
- session详解
- 对象关系映射常用配置
hibernate.cfg.xml 常用配置
1、show_sql:是否把Hibernate运行时的SQL语句输出到控制台,编码阶段便于测试
2、format_sql:输出到控制台的SQL语句是否进行排版,便于阅读。建议设置为true
3、hbm2ddl.auto:可以帮助由Java代码生成数据库脚本,进而生成具体的表结构。
create:表示每次生成新的表结构,原有表存在则先删除再创建新表并添加记录
update:在原表上进行更新
create-drop:表示先创建再删除
validate:对原有表结构进行验证,如果现有表结构和原有表结构不同,则不会创建表结构
4、default_schema:默认数据库,数据库前缀
5、dialect:配置Hibernate数据库方言,hibernate可针对特殊的数据库进行优化
(可在配置名前加hibernate)
session简介
1、hibernate的执行流程
2、session简介
session可理解为操作数据库的对象
session与connection,是多对一关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用
transaction简介
1、hibernate对数据的操作都是封装在事务当中,并且默认是非自动提交的方式。所以用session保存对象时,如果不开启事务,并且手工提交事务,对象并不会真正保存在数据库中
2、如果想让hibernate像jdbc那样自动提交事务,必须调用session对象的doWork()方法,获得jdbc的connection后,设置其为自动提交事务模式(注意:并不推荐这样做)
session.doWork(new Work(){
@override
public void execute(Connection connection) throws Exception){
connection.setAutoCommit(true);
}
});
session.save(new Student());
session.flush();
session详解
1、如何获得session对象
- openSession()
- getCurrentSession()
如果使用getCurrentSession需要在hibernate.cfg.xml文件中进行配置:
如果是本地事务(jdbc事务)
<property name="hibernate.current_session_context_class">thread</property>
如果是全局事务(jta事务)
<property name="hibernate.current_session_context_class">jta</property>
openSession方法:
public void testOpenSession(){
//获取配置对象
Configuration config = new Configuration().configure();
//获得服务注册对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.applySettings(config.getProperties()).buildServiceRegistry();
//获得sessionFactory对象
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
//获得session对象
Session session = sessionFactory.openSession();
if(session!=null){
System.out.println("session创建成功!");
} else {
System.out.prinltn("session创建失败!");
}
}
getCurrentSession方法
public void testGetCurrentSession(){
//获取配置对象
Configuration config = new Configuration().configure();
//获得服务注册对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.applySettings(config.getProperties()).buildServiceRegistry();
//获得sessionFactory对象
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
//获得session对象
Session session = sessionFactory.getCurrentSession();
if(session!=null){
System.out.println("session创建成功!");
} else {
System.out.prinltn("session创建失败!");
}
}
openSession与getCurrentSession的区别
- 1、getCurrentSession在事务提交或者回滚之后会自动关闭,而openSession需要手动关闭。如果使用openSession而没有手动关闭,多次之后会导致连接池溢出
- 2、openSession每次创建新的session对象,getCurrentSession使用现有的session对象
对象关系文档常用设置
<hibernate-mapping
schema = "schemaName"
catalog = "catalogName"
default-cascade = "cascade_style" //级联风格
default-access = "field | property | ClassName" //访问策略
default-lazy = "true | false" //加载策略
package = "packagename"
/>
<class
name = "ClassName"
table = "tableName"
batch-size = "N"
where = "condition"
entity-name = "EntityName"
/>
<id
name = "propertyName"
type = "typename"
column = "column_name"
length = "length"
<generator class = "generatorClass"/> //主键生成策略
</id>
主键生成策略