Hibernate4
hibernate4.3下载路径:http://download.csdn.net/download/angel_he/7409097

property-ref:填写的是学生的关联关系,针对一对多的情况,在id端不能配置property-ref
并且测试时要先保存学生端,才能进行查询
参考博客:http://johndoe.iteye.com/blog/1420046
二级hibernate.cfg.xml缓存配置:
<!-- 开启二级缓存 -->
<property name="hibernate.cache.region.factory_class">
org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
</property> 
hibernate4和hibernate5区别:
* hibernate4需要的Query接口为:org.hibernate.Query
* hibernate5需要的Query接口为:org.hibernate.query.Query;
* load和get需要强转
* 查询多条记录的时候;需要使用:query.list()
* hql查询单条时:Hibernate4:query.uniqueResult;Hibernate5:query.getSingleResult();
MySQL安装路径:C:\Program Files (x86)\MySQL\MySQL Server 5.5
修改默认mysql编码:
my.ini文件:default-character-set=utf8 和 character-set-server=utf8
cmd 关闭mysql服务: net stop mysql
启动mysql服务:net start mysql
1.持久化:加载:hibernate里,数据从数据库中加载到session
2.Hibernate(针对关系型数据库):是一个orm的轻量级框架,解决持久化操作,使得程序员可以从编写繁复的jdbc工作中解放出来,专注于业务,
以面向对象的方式处理关系,提供了缓存,提高开发效率。ORM:对象关系映射
阻抗不匹配:对象和关系数据库不匹配
没有侵入性:在代码中不用去继承hibernate类或hibernate提供的接口
3.类库文件:D:\MainSoftWare\hibernate4.3\hibernate-release-4.3.5.Final\lib\required
将D:\MainSoftWare\hibernate4.3\hibernate-release-4.3.5.Final\project\etc\hibernate.cfg.xml放到src目录
在目录下有hibernate.properties存放各大数据库的连接信息
hibernate.cfg.xml配置信息:
<hibernate-configuration>
<session-factory >
<!-- 配置数据库信息 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/mydb</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
</session-factory>
</hibernate-configuration> 4.hibernate测试流程:
//1.新建Configuration
//2.通过Configureation创建SessionFactory对象
//3.得到SessionFactory得到Session
//4.通过Session对象得到Transaction对象
//5.保存数据
//6.提交事务
//7.关闭session等 修改主键自动增长:alter table customers change id id int not null auto_increment primary key;
1.创建与数据库对应的javabean
public class UserInfo{
private int uid; //必须字段与数据库的字段一一对应,名字类型要一致private String uname;private String upwd;
2.在javabean对应的包下创建 UserInfo.hbm.xml配置与数据表对应的信息
<?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 ><class name="com.bean.UserInfo" table="news"><id name="uid"><generator class="native"></generator> <!-- 主键生成策略 native自动增长 --></id><property name="uname" column="uname"></property><property name="upwd" column="upwd"></property></class></hibernate-mapping>
3.配置hibernate.cfg.xml文件
<property name="connection.url">jdbc:mysql://mydb</property>相当于
<property name="connection.url"> jdbc:mysql://localhost:3306/mydb</property>

<proterty name="format_sql">true</property> //格式化控制台显示的sql
<proterty name="hbm2ddl.auto">create</property> //数据库更新方式,
create:每次执行先把原有数据表删除,然后创建该表,再进行crud操作
create-drop:会显式关闭SessionFactory,drop掉数据库schema(表)
validate:检测
update:如果表不存在则创建,有则不创建(一般设置为update)
4.写测试类
Configuration conf=new Configuration().configure(); //configure()默认读取src下的hibernate.cfg.xml文件,
//可以读取自定义文件configure("hhh.cfg.xml")
ServiceRegistry sr=new StandardServiceRegistryBuilder().applySettings(conf.getProperties()).build();
SessionFactory sf=conf.buildSessionFactory(sr);
Session session=sf.openSession(); //3.得到SessionFactory得到Session
Transaction transaction=session.beginTransaction(); //4.通过Session对象得到Transaction对象
UserInfo ui=new UserInfo(); //5.保存数据
ui.setUname("kkk");
ui.setUpwd("ss");
session.save(ui); //推荐加session.flush();
UserInfo u=(UserInfo) session.get(UserInfo.class, 1); //查询数据 1代表第一个记录相当于getByid
System.out.println("uname:"+u.getUname());
transaction.commit(); //6.提交事务
session.close(); //7.关闭session等5.a) 通过ServiceRegistry实例创建SessionFactory实例,在一个应用中最好也是单例的,线程安全,属于进程级别的对象。
b)Session对象:使用Hibernate进行数据库操作,主要使用session。Session可以理解为Connection对象的一个包装。
Session对象中提供了数据库的crud操作。Session是一个线程不安全的对象,生命周期非常短暂,一般和事务一一对应。
6.Transaction对象:事务管理对象,通过session来获取该对象,能进行事务的开启、提交和回滚。
两种方式开启事务:
a) Transaction tx=session.beginTransaction();
b) Transaction tran=session.getTransaction();
tran.begin();
7.日志:
a)确定要使用日志的实现log4j
b)slf4j-api-1.7.12.jar和log4j.jar放入classpath
c)编写log4j.properties,放在src目录下
9.Hbm.xml详解:
a) pojo类:1.提供公共的无参构造方法,通过反射产生对象
2.属性用private修饰,并且生成get和set方法
3.类不能用final修饰---hibernate会产生代理类(cglib)
4.类需要指明标识,hbm.xml指明<id name="id" column="id"> name对应数据库表中的主键
column表示对应数据库表的列名,如果不写则数据库表中列名和属性名一致
5.<property name="user"/> user区分大小写

10.根据主键加载持久化实体
session.load(User.class,pk)
session.get(User.class,7);
get和load 区别:get/load都会去立即查询对象;get找不到对象时,返回null;load则会抛出异常
clear:清除session缓存中所有对象 evict: 清除指定对象
session.delete(user); //手动构造一个对象,指定主键是可以删除(更新也是)对象,但不推荐
User user=(User)session.get(User.class,3); //应使用此形式删除,可以避免null异常;load类似
if(user!=null){
session.delete(user);
}
对象声明周期:
11.使用SchemaExport
Configuration cfg=new Configuration.configure();
SchemaExport se=new SchemaExport(cfg);
se.create(true,true); //第一个参数是否生成ddl脚本,第二个参数 是否执行到数据库中
12.组合主键
1.编写组合主键的类,该类必须实现Serializable接口,最好实现equals()和hashcode()
2.在主类中引用组合主键;socreId是组合主键;stuId是主类主键

13.大对象处理
java.sql.Blob和java.Clob存储可达4G
<property name="image" type="java.sql.Blob"/>
操作大数据对象:
Blob blob=new SerialBlob("ttt".getBytes());
Clob clob=new SerialClob("sss".toCharArray());
14.组件映射
组件:是一个被包含的对象,在持久化的过程中,被当做值类型,而并非一个实体的引用
<id name="id">
<generator class="native"/>
</id> <component name="addr" class="Address"> //Address作为Teacher的成员,只生成一张表
<property name="addr1"/>
</component>
15.多对一
Student对应Grade,Student中存放grade对象
grade外键表的对象作为Student主表的成员,表各自定一张hbm.xml,然后通过以下映射多对一外键关系
<!-- 多对一 name表示属性名 class属性对应的类 column数据库表中的列名 -->
<many-to-one name="grade" class="Grade" column="grade_id" foreign-key="fk_grade" not-null="true"/>16.一对多
使用HibernateUtil时需要改成<property name="connection.url">jdbc:mysql:///hibernatedb</property>
grade中存放Student对象,形成一对多
Grade中写: private Set<Student> students=new HashSet<Student>(0);
<set name="students">
<key column="grade_id" not-null="true"/> 指明外键列名,保存数据顺序根据外键决定,如果外键为not-null,则先保存一的一端
如果外键可以为null,则可以随意保存
<one-to-many class="Student"/>
</set>
grade.getStudents().add(s); //保存数据的顺序 是根据外键的配置来决定的
session.save(grade); //如果外键不能为null,那么先保存一的一端
session.save(s); //如果外键可以为null,则可以随意保存
4.操作hibernate流程:
1.开发持久化类,由POJO+持久化注解组成
2.获取Configuration
3.获取SessionFactory
4.获取Session,打开事务
5.用面向对象的方式操作数据库
6.关闭事务,关闭session
PO与session关联关系:
瞬态:PO实例(new Java实例)从未与Session关联过
持久化:PO实例与Session关联过,且改实例对应到数据库记录
脱管:PO实例曾与Session关联过,但因为Session的关闭等原因,PO脱离了Session的管理
http://blog.csdn.net/zys_hh/article/details/20721261
6.Hibernate.cache.use_second_level_cache:是否设置二级缓存
hibernate持久化类要求:
1.提供一个无参数的构造器
2.提供一个标识的属性(映射到数据库表的主键)
7.持久化实体:
1.Serializable save(Object obj):将obj对象变为持久化对象,该对象的属性将被保存到数据库;返回记录值的主键
2.void persist(Object obj):将obj转为持久化状态;无任何返回
3.Serializable save(Object obj,Object pk)指定主键保存
4.void persist(Object obj,Object pk)
posted on 2018-03-06 18:05 xiaojiayu0011 阅读(156) 评论(0) 收藏 举报
浙公网安备 33010602011771号