
Hibernate框架学习
文章平均质量分 86
Hibernate入门、框架的使用,以及常用的XML配置和注解的配置方法,缓存的使用和实例的验证,新手和老手都可以学习到新东西
光仔December
技术宅,系统集成项目管理工程师,FCP-报表开发工程师,全国软件开发(C/C++)专业人才高级认证,2014年ACM-ICPC河南省赛区银奖,2014年第五届蓝桥杯河南赛区C/C++程序设计本科B组二等奖,2015年甲骨文杯全国Java程序设计大赛华中赛区A组二等奖,2015年中国大学生计算机设计大赛团队三等奖
展开
-
【hibernate框架】使用hibernate实现悲观锁和乐观锁
四种隔离机制不要忘记:(1,2,4,8)1.read-uncommitted:能够去读那些没有提交的数据(允许脏读的存在)2.read-committed:不会出现脏读,因为只有另一个事务提交才会读取来结果,但仍然会出现不可重复读和幻读现象。4.repeatable read:MySQL默认。可重复读,读数据读出来之后给它加把锁,其他人先别更新,等我用完了你再更新。你的事务没完原创 2015-03-10 15:48:56 · 4776 阅读 · 0 评论 -
【hibernate框架】事务并发处理
事务并发处理:a)事务:ACID(事务的四个特性) i.Atomic(原子性)、Consistency(一致性)、Itegrity(独立性)、Durability(持久性)A:要么全部执行,要么不执行。C:事务的运行不该变数据库中数据的一致性。I:两个以上的事务不会出现交错执行的状态。D:事务运行以后,系统的更新是永久的,不会无缘无故的回滚。b)事务并发时可原创 2015-03-10 15:33:14 · 1280 阅读 · 0 评论 -
【hibernate框架】缓存机制之查询缓存
查询缓存是面对重复缓存的,是依赖于二级缓存的,所以一定要打开二级缓存。1.load默认使用二级缓存,iterate默认使用二级缓存2.list默认往二级缓存中加数据,但是查询的时候不使用3.如果要query用二级缓存,需打开查询缓存i.tureii.调用Query的setCacheable(true)方法指明使用二级缓存。证明查询缓存已经起作用了:@Test原创 2015-03-08 12:56:29 · 1366 阅读 · 0 评论 -
【hibernate框架】缓存机制之二级缓存
二级缓存是sessionFactory级别的缓存,可以跨越session存在。hibernate文档里关于二级缓存的说明:二级缓存(The Second Level Cache)hibernate支持多种多样的二级缓存的实现,但hibernate本身并没有写二级缓存的实现(有一个是用来内部测试的,不要用于产品开发),而是由其他的厂商来提供。表 21.1. 缓存策略提供商(C原创 2015-03-08 12:45:22 · 3802 阅读 · 0 评论 -
【hibernate框架】缓存机制之一级缓存
什么是缓存:我们在内存中开辟一块空间,把本来应该存储在硬盘上的东西,然后给它放在内存里,将来要读的时候从内存中读,这个部分就叫做缓存。在hibernate有三种缓存,一级缓存,二级缓存和查询缓存。一级缓存是session级别的缓存。例子:@Testpublic void testHuanCun(){ Session session = sf.openSession();原创 2015-03-08 12:35:40 · 1238 阅读 · 0 评论 -
【hibernate框架】性能优化之session.clear()的运用和Java内存泄露问题
注意session.clear()的运用,尤其在不断分页循环的时候。a)在一个大集合中进行遍历,遍历msg,取出其中的含有敏感字样的对象。hibernate里面有一个缓存,是session级的缓存。一张表里面存了上百万的商品信息,我们要取出这些内容并且进行分页,点击下一页查看商品信息,现在假设在同一个session里面执行这个操作,这时候就会有问题。session先取50条进来,然后再原创 2015-02-25 15:18:52 · 2762 阅读 · 1 评论 -
【hibernate框架】性能优化之list_iterate的不同之处
list与iterate的不同之处:还是用上一次的例子,话题topic和版块categoryTopic.java:package com.bjsxt.hibernate;import java.util.ArrayList;import java.util.Date;import java.util.List;import javax.persistence.Entit原创 2015-02-25 15:13:47 · 1759 阅读 · 0 评论 -
【hibernate框架】性能优化之1+N问题
1+N问题/典型的面试题a)Lazyb)BatchSizec)join fetch什么是1+N:如果我在一个对象里面关联另外一个对象,同时fetch=FetchType.EAGER,最典型的是@ManyToOne。本来我用一条Sql语句就可以解决的,结果发了1条外加N条sql语句。1+N问题实例剖析Category.java:package com.bjsx原创 2015-02-25 15:12:23 · 2264 阅读 · 0 评论 -
【hibernate框架】面向对象的查询语法(QBE和QBC)
QBC和QBEQBC:(Query By Criteria)Criteria是Criterion的复数,是"标准、准则、约束"的意思。用法:@Testpublic void testQBC() { Session session = sf.openSession(); session.beginTransaction(); //criterion 标准/准则/约原创 2015-02-25 15:06:06 · 1689 阅读 · 0 评论 -
【hibernate框架】EJBQL第二部分
工程和上一个一样,Topic有所改变,加了一个Topic的Msg的List列表属性,这个属性用来存放每个Topic下有多少条回帖。例子项目:BBS小项目(EJBQL是HQL的子集,所以直接说是HQL也无可厚非)Category(版块):里面有不同的主题,不同的主题有不同的发帖Topic(主题),Msg(具体的回复帖子)Category与Topic之间的关系是一对多(On原创 2015-02-23 20:10:28 · 1130 阅读 · 0 评论 -
【hibernate框架】EJBQL第一部分
总结:QL应该和导航关系结合,共同为查询提供服务。导航写全面了,QL语句就可以写的简单。例子项目:BBS小项目(EJBQL是HQL的子集,所以直接说是HQL也无可厚非)Category(版块):里面有不同的主题,不同的主题有不同的发帖Topic(主题),Msg(具体的回复帖子)Category与Topic之间的关系是一对多(OneToMany),Topic与Msg的关系原创 2015-02-23 18:20:30 · 1561 阅读 · 0 评论 -
【hibernate框架】练习-学生、课程、分数的设计(重要)
学生、课程、分数的设计(重要)表设计:方法1:设置联合主键@EmbeddedId实现Serializable接口student:id namecourse:id namescore:studentid courseid score//联合主键联合id//有点麻烦不写了,直接看方法2吧方法2:student:id namecourse:id n原创 2015-02-23 18:07:29 · 2493 阅读 · 0 评论 -
【hibernate框架】练习-树状结构设计(非常重要)
作业:树状结构的设计在同一个类中使用OneToMany和ManyToOne首先想数据库的模型,再想面向对象的模型,然后再来想怎么去做映射,做完映射在想怎么去做CRUD。1.首先设计数据库的模型应该是Id、parent_Id.单一父亲,好多孩子这就是一棵树。数据库首先存在的属性有:Id parent_Id name例子:ID Parent_ID原创 2015-02-22 12:58:25 · 3292 阅读 · 0 评论 -
【hibernate框架】继承映射
A.继承映射简述举个实例:Person类、Student类,Teacher类。Person类里面有几个属性:nameStudent类里面有几个属性:除了name还有分数scoreTeacher类里面有几个属性:除了name还有职称title如何用数据库表来表示这些关系呢?下面说说继承映射的三种主要设计1.设计一可以设置一张表:id name原创 2015-02-22 12:47:05 · 1279 阅读 · 0 评论 -
【hibernate框架】几种集合映射
1.Set前面我们已经用过,就不再说。2.ListGroup.java:package cn.edu.hpu.listMapping;import java.util.ArrayList;import java.util.List;import javax.persistence.CascadeType;import javax.persistence.Enti原创 2015-02-22 11:55:11 · 1456 阅读 · 0 评论 -
【hibernate框架】一对多(多对一)双向CRUD-关于update
如果没有关联关系,平常我们使用save、get、update、delete方法即可对实体对象进行增删改查,但是一旦实体对象有关联关系的时候,就不能直接使用save、get、update、delete方法了,就要进行一系列的语句拆分和组合。牵扯到对一个实体对象做操作,是否要对关联的另外一个实体对象做操作。这里来探讨一下更新update在“多对一”关联关系中的问题:原创 2015-02-20 18:29:17 · 4099 阅读 · 2 评论 -
【hibernate框架】一对多(多对一)双向CRUD-关于delete2
如果没有关联关系,平常我们使用save、get、update、delete方法即可对实体对象进行增删改查,但是一旦实体对象有关联关系的时候,就不能直接使用save、get、update、delete方法了,就要进行一系列的语句拆分和组合。牵扯到对一个实体对象做操作,是否要对关联的另外一个实体对象做操作。这里来探讨一下删除delete“多对一”中“多”这一方的问题:User.原创 2015-02-20 18:25:04 · 1552 阅读 · 0 评论 -
【hibernate框架】一对多(多对一)双向CRUD-关于delete1
如果没有关联关系,平常我们使用save、get、update、delete方法即可对实体对象进行增删改查,但是一旦实体对象有关联关系的时候,就不能直接使用save、get、update、delete方法了,就要进行一系列的语句拆分和组合。牵扯到对一个实体对象做操作,是否要对关联的另外一个实体对象做操作。这里来探讨一下删除delete“多对一”中“一”这一方的问题:User.原创 2015-02-20 18:22:02 · 1352 阅读 · 0 评论 -
【hibernate框架】一对多(多对一)双向CRUD-Fetch2
继续对Fetch注解进行测试User.java:package cn.edu.hpu.one2many;import javax.persistence.CascadeType;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.Generated原创 2015-02-15 15:41:21 · 1447 阅读 · 0 评论 -
【hibernate框架】一对多(多对一)双向CRUD-Fetch1
关于把数据从里面拿出来是什么样子。User.java:package cn.edu.hpu.one2many;import javax.persistence.CascadeType;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persisten原创 2015-02-15 15:35:02 · 1335 阅读 · 0 评论 -
【hibernate框架】一对多(多对一)双向CRUD-Cascade2
现在反向测试Group是否能关联User存储。User.java:package cn.edu.hpu.one2many;import javax.persistence.CascadeType;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persisten原创 2015-02-15 15:31:56 · 911 阅读 · 0 评论 -
【hibernate框架】一对多(多对一)双向CRUD-Cascade1
下面对一对多(多对一)的关联关系的CRUD进行测试。这里用的是注解AnnotationUser.java:package cn.edu.hpu.one2many;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;i原创 2015-02-15 15:26:07 · 1098 阅读 · 0 评论 -
【hibernate框架】多对多双向关联(XML实现)
多对多的双向关联:(非常少用)通过老师可以知道他教了多少学生,这是单项多对多。而如果同时通过学生知道有多少个老师教他,那么就是多对多双向的关联。XML实现:Student.java:package cn.edu.hpu.many2many;import java.util.HashSet; import java.util.Set;public class S原创 2015-02-13 15:44:54 · 1438 阅读 · 0 评论 -
【hibernate框架】多对多单向关联(Annotation实现)
什么情况下是多对多?举个例子:一个老师可以教多个学生,每个学生也可以被多个老师教。这就是多对多的情况。在数据库表中这种关系该怎么设计?很简单,加一张中间表。设计模型:table_student id table_teacher id 中间表:T_S t_id s_id 比如老师2教学生1,在中间表中就存2,1老师2教学生3,在中间表中就原创 2015-02-11 12:28:17 · 909 阅读 · 0 评论 -
【hibernate框架】多对多单向关联(XML实现)
什么情况下是多对多?举个例子:一个老师可以教多个学生,每个学生也可以被多个老师教。这就是多对多的情况。在数据库表中这种关系该怎么设计?很简单,加一张中间表。设计模型:table_student id table_teacher id 中间表:T_S t_id s_id 比如老师2教学生1,在中间表中就存2,1老师2教学生3,在中间表中就原创 2015-02-11 12:24:47 · 925 阅读 · 0 评论 -
【hibernate框架】一对多(多对一)双向关联(Annotation实现)
用户和组的关联,一个用户只能属于一个组,一个组可以拥有多个用户User.java:package cn.edu.hpu.one2many;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persis原创 2015-02-11 12:22:02 · 947 阅读 · 0 评论 -
【hibernate框架】一对多(多对一)双向关联(XML实现)
用户和组的关联,一个用户只能属于一个组,一个组可以拥有多个用户User.java:package cn.edu.hpu.one2many;public class User { private int id; private String name; private Group group; public Group getGroup() { return group原创 2015-02-11 12:19:58 · 2125 阅读 · 0 评论 -
【hibernate框架】多对一单向关联(Annotation实现)
一个组有多个用户,一个用户只能属于一个组。使用Annotation注解来实现多对一单项关联Group.java:package cn.edu.hpu.many2one;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;im原创 2015-02-09 21:09:25 · 954 阅读 · 0 评论 -
【hibernate框架】多对一单向关联(XML实现)
一个组有多个用户,一个用户只能属于一个组。使用XML来实现多对一单项关联Group.java:package cn.edu.hpu.many2one;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import java原创 2015-02-09 21:06:25 · 939 阅读 · 0 评论 -
【hibernate框架】关于多对一与一对多关系的剖析
关于一对多,举个例子,一个用户组可以包含多个用户,每个用户只能属于一个用户组。一个人可以有多辆车,每辆车只能属于一个人。这些都是一对多的关系。打个比方,一个人可以有多辆车,每辆车只能属于一个人。两张表,一张表Person,一张表Car。关键是他们两个之间在数据库表中怎么设计关联呢?Person id name; Car id color;错误做法:1.在一方原创 2015-02-09 21:02:09 · 915 阅读 · 0 评论 -
【hibernate框架】一对一单向主键关联(Annotation实现)
单项主键关联指的是:husband和wife之间有关联关联的。但是是用主键做关联的,说白了就是husband的id会参考wife的id(husband的id是1,n那么它所对应的wife的id也是1)。Husband.java:package cn.edu.hpu.one2one;import javax.persistence.Entity;import javax.pers原创 2015-02-06 15:33:42 · 1833 阅读 · 0 评论 -
【hibernate框架】一对一单向主键关联(XML实现)
依然是学生和学生卡的关联,这次是一对一单项主键关联student.cfg.xml:<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">原创 2015-02-06 15:32:13 · 1346 阅读 · 0 评论 -
【hibernate框架】一对一双向外键关联(Annotation实现)
一对一双向外键关联(Annotation方法):一夫(Husband)一妻(Wife)的一对一双向外键关联Husband和Wife实体类:package cn.edu.hpu.one2one;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.pers原创 2015-02-04 13:37:56 · 1093 阅读 · 0 评论 -
【hibernate框架】一对一双向外键关联(XML实现)
以Student与StuIDCard一对一双向关联为例,说一下用XML实现两者的一对一双向关联。学生与学生证之间的关联关系。Student.java:package cn.edu.hpu.model;public class Student { private int id; private String name; private int age; publ原创 2015-02-04 13:18:16 · 1078 阅读 · 0 评论 -
【hibernate框架】关系映射之一对一单项外键关联(Annotation实现)
一对一单向外键关联(Annotation做法):例子,假设一夫配一妻(Husband与Wife)。两个实体类的例子:Husband.java:package cn.edu.hpu.one2one;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.pe原创 2015-02-03 19:22:53 · 1016 阅读 · 0 评论 -
【hibernate框架】关系映射之一对一单向外键关联(XML实现)
在XML里面如何单向关联:学生证与学生卡是一对一的关系,在学生证那一方做关联Student.java:package cn.edu.hpu.model;public class Student { private int id; private String name; private int age; public int getId() { return原创 2015-02-03 19:18:52 · 1074 阅读 · 0 评论 -
【hibernate框架】核心开发接口-Clear方法与flush方法
1.Clear方法:无论是load还是get,都会首先查找缓存(一级缓存),如果没有,才会去数据库查找,调用clear()方法可以强制清除session缓存。示例:public void testClear(){ Configuration cfg=new AnnotationConfiguration(); SessionFactory sf=cfg.configure(原创 2015-02-02 16:46:53 · 1450 阅读 · 0 评论 -
【hibernate框架】核心开发接口-saveOrUpdate方法与delete方法
1.saveOrUpdate方法剖析saveOrUpdate方法:分情况看是save还是update。示例:public void testSaveOrUpdate(){ Teacher t=new Teacher(); t.setName("t21"); t.setTitle("低级"); t.setBrithday(new Date()); t.setZhiche原创 2015-02-02 16:41:57 · 1513 阅读 · 0 评论 -
【hibernate框架】核心开发接口-update方法
1.更新一个Detached(脱管状态)对象,把它重新变成Persistent(持久化状态),然后在数据库里做更新。示例:public void testUpDate1(){ Configuration cfg=new Configuration(); SessionFactory sf=cfg.configure().buildSessionFactory(); Ses原创 2015-02-02 16:33:14 · 1508 阅读 · 0 评论 -
【hibernate框架】核心开发接口-load和get方法
Load方法,从数据库里取数据,并封装成JAVA对象。示例:public void testLoad(){ Configuration cfg=new AnnotationConfiguration(); SessionFactory sf=cfg.configure().buildSessionFactory(); Session session=sf.openSession原创 2015-01-31 16:46:05 · 1575 阅读 · 0 评论