hibernate进阶学习笔记
来源:互联网 发布:windows ime文件 编辑:程序博客网 时间:2024/04/30 17:10
一、hibernate常用配置
1、hibernate.cfg.xml常用配置
此处代码借用别人的博客代码,原文请查看:http://blog.csdn.net/qiaqia609/article/details/9456489/
<!--hibernate.dialect 只是Hibernate使用的数据库方言,就是要用Hibernate连接那种类型的数据库服务器。--> <property name="dialect">org.hibernate.dialect.MySQLDialect </property> <!--是否将hibernate运行时的SQL语句输出到控制台,编码阶段便于测试。--> <property name="show_sql">true </property> <!-- 输出到控制台的SQL语句是否进行排版,便于阅读。建议设置为true. --> <property name="format_sql">true</property> <!-- 可以帮助由java代码生成数据库脚本,进而生成具体的表结构 create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表, 哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。 update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库), 以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的 行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。 create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。 val: validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。 --> <property name="hbm2dd1.auto">create</property>
hibernate.hbm2ddl.auto的参数配置解释:
validate 加载hibernate时,验证创建数据库表结构create 每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。create-drop 加载hibernate时创建,退出是删除表结构update 加载hibernate自动更新数据库结构
二、session的简介
1、hibernate的执行流程
(1)应用程序先调用Configration类,该类读取Hibernate的配置文件及映射文件中的信息,并用这些信息生成一个SessionFactpry对象。
(2)然后从SessionFactory对象生成一个Session对象,并用Session对象生成Transaction对象;可通过Session对像get(),load(),save(),update(),delete()和saveOrUpdate()等方法对PO进行加载,保存,更新,删除等操作;在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将 提交这些操作结果到数据库中。(session类似于JDBC中的connection,创建一个session对象就相当于创建了一个数据库连接。)
2、什么是session?
(1)session可以理解为一个操作数据库的对象。
(2)session与connection,是多对一的关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用。
(3)把对象保存到关系数据库中需要调用session的各种方法,如get(),load(),save(),update(),delete()和saveOrUpdate()等。
三、transaction简介
1、hibernate对数据的操作都是封装在事务当中,并给默认是非自动提交的方式。所以用session保存对象时,如果不开启事务,并且手工提交事务,对象并不会真正保存在数据库中。
2、如果想让hibernate想jdbc那样自动提交事物,必须调用session对象的doWork()方法,获得jdbc的connection后,设置为自动提交事务模式。(注意:通常不推荐这样做。)
public void testSaveStudent(){ //生成一个学生对象 Student student=new Student(1,"张三","123456"); //重写doWork()方法。 session.doWork(new Work(){ @Override public void execute(Connection connection) throws SQLException { // TODO Auto-generated method stub connection.setAutoCommit(true); } }); //保存对象进入数据库 session.save(student); session.flush(); }
四、session详解
1、如何获得session对象
(1)openSession
(2)getCurrentSession
如果使用getCurrentSession获得session对象,则需要在hibernate.cfg.xml文件中进行配置:
a、如果是本地事物(JDBC事务)
<property name="hibernate.current_session_context_class">thread</property>
b、如果是全局事物(jta事物)
<property name="hibernate.current_session_context_class">jta</property>
通过两种方式获得session对象的代码示例:
import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;public class SessionTest { private SessionFactory sessionFactory;//会话工厂 private Session session; private Transaction transaction;//事物对象 public void testOpenSession(){ //创建配置对象 Configuration config=new Configuration().configure(); //创建服务注册对象 ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); //创建会话工厂对象 sessionFactory=config.buildSessionFactory(serviceRegistry); //会话对象 session=sessionFactory.openSession(); if(session!=null){ System.out.println("session创建成功!"); } else{ System.out.println("session创建失败!"); } } public void testGetCurrentSession(){ //创建配置对象 Configuration config=new Configuration().configure(); //创建服务注册对象 ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); //创建会话工厂对象 sessionFactory=config.buildSessionFactory(serviceRegistry); //会话对象 session=sessionFactory.getCurrentSession(); if(session!=null){ System.out.println("session创建成功!"); } else{ System.out.println("session创建失败!"); } }}
2、openSession和getCurrentSession的区别
(1)getCurrentSession在事务提交或者回滚之后会自动关闭,而openSession需要手动关闭,如果使用openSession没有手动关闭,多次之后会导致连接池溢出。
(2)openSession每次创建的是新的session对象,而getCurrentSession使用的是现有的session对象。
六、hbm配置文件常用设置
1、
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2017-3-11 11:08:16 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping><!-- 将一个实体类映射成了数据库里的一张表,这里就是将Student实体类,映射成了STUDENT这张表 --> <class name="hibernate.Student" table="STUDENT"> <!-- 将实体类属性映射成数据库表里的一个字段 --> <id name="sid" type="int"> <column name="SID" /> <generator class="assigned" /> </id> <property name="sname" type="java.lang.String"> <column name="SNAME" /> </property> <property name="password" type="java.lang.String"> <column name="PASSWORD" /> </property> </class></hibernate-mapping>
标签的属性如下:
1)package:指定一个包前缀,如果在映射文档中(就是在class标签的那么属性里没有指定全类名)没有指定全限定的类名,就使用这个作为包名,
2)schema:数据库schema的名称
3)catalog:数据库catalog的名称
4)default-cascade:默认的级联风格,默认为none
5)default-access:Hibernate用来访问属性的策略
6)default-lazy:指定了此属性,未明确注明lazy属性的Java属性和集合类,Hibernate会采取的默认使用这个属性加载风格,默认为true
7)auto-import:指定我们是否可以在查询语言中使用非全限定的类名,默认为true,如果项目中有两个同名的持久化类,则最好在这两个类的对应的映射文件中配置为false
Hibernate的子标签class标签:
class 元素用于指定类和表的映射
name:指定该持久化类映射的持久化类的类名
example:
table:指定该持久化类映射的表名, Hibernate 默认以持久化类的类名作为表名
example:
dynamic-insert: 若设置为 true, 表示当(调用Session的save()方法时)保存一个对象时, 会动态生成 insert 语句, insert 语句中仅包含所有取值不为 null 的字段. 默认值为 false
Example:这个跟dynamic-update一个意思
dynamic-update: 若设置为 true, 表示当(调用对象的set()方法)更新一个对象时, 会动态生成 update 语句, update 语句中仅包含所有取值需要更新的字段. 默认值为 false
2、主键生成策略
可查看博客(别人的,这里偷一下懒):http://www.cnblogs.com/hoobey/p/5508992.html
七、hibernate单表操作
1、单一主健
(1)assigned:由java应用程序负责生成(手工赋值)
(2)native:由底层数据库自动生成标示符,如果MySQL就是increment,如果是Oracle就是sequence等等。
2、基本类型
3、对象类型
注:Mysql不支持标准SQL的CLOB类型,在Mysql中,用TEXT,MEDIUMTEXT及LONGTEXT类型来表示长度超过255的长文本数据。
BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。BLOB是一 个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。
写入照片保存到数据库中代码实例:
读取照片代码实例:
4、组件属性
如果持久化类的属性并不是基本数据类型,也不是一个日期或者字符串常量,而是一个复合类型的对象,例如 private Name name; 那么这就是一个组件属性。
组件属性可以是任何普通的java类对象,在映射文件中则用标签标识,中又可以像那样包含子元素,此外中还可以包含一个子元素用来指向容器实体。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com"> <class name="Person" table="Person_inf"> <id name="id" column="person_id" type="int"> <generator class="identity" /> </id> <property name="age" type="int" /> <component name="name" class="Name" unique="true"> <parent name="owner"/> <property name="first" /> <property name="last" /> </component> </class></hibernate-mapping>
- hibernate进阶学习笔记
- Hibernate学习进阶
- 我的java学习笔记之hibernate进阶…
- Hibernate进阶学习(一)
- vim进阶学习笔记
- [学习笔记]JavaScript进阶
- Activity进阶学习笔记
- java进阶学习笔记
- [学习笔记]JavaScript进阶
- 学习进阶笔记
- JavaScript学习笔记---进阶
- mysql进阶学习笔记
- Redis学习笔记-进阶
- Python进阶学习笔记
- Python学习笔记(进阶)
- Python学习笔记(进阶)
- JavaScript进阶学习笔记
- Android 进阶学习笔记
- codeforces721A
- 第一天学习MySql(1)-从创建到删除
- TCP网络编程中connect()、listen()和accept()三者之间的关系
- GYM 101128 C.Canvas Painting(优先队列)
- EditPlus修改成护眼色
- hibernate进阶学习笔记
- 范式简介
- 使用AngularJS完成一个简单的todoList
- SQL教程重温
- windows中安装MySQL绿色社区版(5.7.17-winx64)
- 我的软件工程课目标
- Android扫描SD卡或者SD下某个文件夹得到想要的文件
- oracle中使用NET Manager连接不到别的数据库解决方法
- mongoVUE中collections为空,即文件树无法展开问题的解决策略