Hibernate完全学习文档
1.Hibernate引用jar文件,建立hibernate.cfg.xml,并配置好改文件.
2.方言:<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
3.使用xml建立Hello world!
(1)xml配置映射实体类:(Class.hbm.xml)
<class name="Class">
<id name="id"></id> <!--主键-->
<property name="age"></property> <!--属性-->
</class>
(2)在hibernate.cfg.xml中配置:<mapping resource="cn/bywei/model/Class.hbm.xml"/>
(3)使用Session
Configuration cfg=new Configuration();
SessionFactory cf=cfg.configure().buildSessionFactory();
Session session=sf.openSession();
session.beginTransaction();
session.save(model);
session.getTransaction().commit();
session.close();
sf.close();
4.使用Annotation建立HelloWorld!
jpa:javax.persistence.Entity;(JPA是一套非常好的标准)
(1)建立一个Model类,使用注解 @Entity标识实体类 @Id 标识主键 @GenertedValue 标识自动增长列
(2)在hibernate.cfg.xml中配置:<mapping resource="cn.bywei.model.Class"/>
(3)使用Session:
Configuration cfg=new AnnotationConfiguration();
SessionFactory sf=cfg.configure().buildSessionFactory();
Session session=sf.openSession();
session.beginTransaction();
session.save(Model);
session.getTransaction().commit();
session.close();
sf.close();
---------小技巧----------
1.使用注解@提示:设置 content Assist
-------------------------
5.O/R Mapping 面对对象的操作
Hibernate.cfg.xml基础配置
1.<property name="hbm2ddl.auto" >create/update/create-drop/validate</property>自动创建表
2.显示sql语句<property name="show_sql">true</property>
3.格式化sql语句<property name="format_sql">true</property>
---------小技巧----------
1.搭建日志环境slfj logfj
2.搭建测试环境 @Test 标识测试方法 @BeforeClass执行前调用的方法@AfterClass
-------------------------
4.Annotation:在Model中指定实体类所对应的数据库Table:@Table(name="tableName")
Xml:<class name="table" table="".......
5.字段名和属性名不同时:Annotation:@Column(name="columnName")
6.指定不可存储到数据库中的属性:Aannotation:@Transient
7.格式化日期精度 @Temporal(TemporalType.DATE) 可以把日期或者日期和时间存储到数据库中
8.映射枚举类型:
public enum Title{
A,B,C
}
private Title title;
@Enumerated(EnumType,STRING) //枚举
public Title getTitle(){
******
}
9.ID的生成策略
xml:<id name="id">
<generator class="uuid"></generator> //class=uuid 标识 字符 native 设置(sqlserver)自动增长列,squence (Oracle中标识列),auto_increamt(mysql)
</id>
Annotation:@generatedValue auto(相当于xml中的active)
当不使用Oracle时,可以设置@GeneratedValue(startegy=GenerationType.IDENTITY) 设置id的生成策略(sqlerver,mysql)
@sequenceGenerator(name="标识名字",sequenceName="数据库中的sequence名字") 指定Oracle生成的sequence名字
@TableGenerator 生成主键策略
@TableGenerator(
name="",
table="GENERATOR_TABLE",
pkColumnName="key",
valueColumnNamne="",
pkClumnValue="",
allocationSize=1
)
10.联合主键(id,name)作为联合主键
在类中:
public class pk implements Serializable{
private int id;
private String name;
}
//@Override equals 和hashcode
//关系到虚拟内存所以需要序列化
//为了判断id 和name和传递过来的是相等的,所以需要@Override equals
public class lianhe{
private pk pk;
}
(1)xml中配置:
<composite-id name="pk" class="****">
<key-property name=""/>
<key-property name=""/>
</composite-id>
(2)Annotation的配置:
-把主键类(pk)注解为@Embeddable,并且把主键的属性注解为@Id
-把主键的属性注解为@EmbeddedId 表示嵌入的主键id
-直接在Entity上注解@IdClass(PK.class) 并在主键id,name上注解@Id
核心开发接口
1.读取配置:
SessionFactory sf=new AnnotationConfiguration().configure("hibernate.cfg.xml").buildSessionFactory();
Session session=sf.getCurrentSession(); //从上下文(在配置文件中设置current_session_context_class--取值:jta,thread,managed,custom.Class)查找,如果有就获取Session,没有就创建新的Session.
//-用于事务的边界 -事务提交时自动Close
//Session session=sf.openSession();//永远是创建一个新Session
session.beginTransaction();
session.save(Entity);
session.getTransaction().commit();
2.对象的三种状态
(1)Transient 刚刚new出来,内存中有对象,但无id
(2)Persistent 内存中有id,在于Session中,数据库中也存在id
(3)Detached Session已经Close没有了Id,数据库中存在id
3.Hibernate的CRUD
(1)save() 对象的三种状态
(2)delete()
(3)load() 和 get()
-load() 生成一个对象代理,需要用到的时候才会调用,
-get() 直接读取数据
(4)update() //设置部分字段不更新@Column(updatable=false)
(5)saveOrUpdate()
(6)clear() 清除Session
(7)flush() 让缓存与数据同步 session.setFlushMode(FlushMode.COMMIT)设置flush的同步时间
4.自动建表
(1)使用hibernate.cfg.xml中的配置自动建表
(2)使用程序控制:new SchemaExport(new AnnotationConfiguration().configure()).create(显示sql-true/false,是否执行到数据库-true/false);
关系映射:
1.一对一
a)单向 一对一单向外键关联:在一方设置另一方的引用(数据库表中设置为外键关联)
Annotation: 在引用上注解:@OneToOne @JoinColumn(name="pk_id")设置引用的外键id名称
xml:<many-to-one name="" column="" unique="true"/>
一对一单向主键关联:
Annotation:在引用上设置@PramaryKeyJoinColumn(hibernate3.2好像有点小bug)
xml:****
b)双向 一对一双向外键关联:在两方都有对方的引用,双方都设置:@OneToOne,其中一方还需设置@OneToOne(mappedBy="另一方的引用名称")
一对一双向主键关联:@OneToOne @PrimaryKeyJoinColumn
xml:****
c)联合主键:@JoinColumns
d)组件映射:在数据库中配置为一张表,把一方设置为另一方的一部分,在引用上设置:@Embedded (表示作为这张表的一部分嵌入到)
2.一对多 多对一
a)多对一的单向:
Annotation:多指向一(@ManyToOne)
xml:<many-to-one name="属性名" column="生成的外键关系名"/>
b)多对一的双向:
Annotation:在多指向一设置@ManyToOne,在一指向多设置@OneToMany(mappedBy="多的一方的关系名称")
xml:一<one-to-many class="" column="和多的一致"/> 多<many-to-one name="" column="和一的一致"/>
3.多对多
a)多对多的单向关联
private Set<**> **=new HashSet<**>();//设置对方的引用
Annotation:一方@ManyToMany @JoinTable(name="中间表名",joinColumns={@JoinColumn(name="对应自己的表的关系名称")}inverseJoinColumns={,@JoinColumn(name="另外一张表的关系名称")})
xml:一方
<set name="属性名" table="数据库中间表名" >
<key column="指向自己的表的关系名"/>
<many-to-many class="" column="指向另外一张表的关系名"/>
</set>
b)多对多的双向关联
private Set<**> **=new HashSet<**>();
//做好单向关联后
Annotation:使用注解@ManyToMany(mapedBy="另外一类(多)中的引用名称")
xml:在另一方设置<many-to-many class="" column=""/>
本文由 程序员百味 http://www.bywei.cn/blog 编写
4.关联关系中的CRUD
(1)保存时注意关联
使用Annotation设置级联操作:在指向另一类的@关系上设置(cascade={casadeType.ALL})//表示对所有的CRUD都进行级联操作
在双向关系中需要设置好双向关联
(2)加载数据 fetch主要影响get/load
(cascade={casadeType.ALL},fetch=FetchType.EAGER) //FetchType取值(EAGER,LAZY)
(3)更新数据时 先做load,再设值
(4)删除数据时 注意casade的设置问题,建议使EJB QL,HQL
5.集合映射(了解)
Set 参考多对多关系映射中(常用)
List 雷同Set(指定排序时@OrderBy("默认Id 或者 属性 asc/desc"))
Map 在设置Set的基础上设置@MapKey(name="map中使用哪个字段作为key")
//里面不能装载基础类型
6.继承映射(了解)
(1)设计为一张表(父类和子类放在一张表中,使用一个标识列标识是哪个对象(type))
(2)设计为多张表(父类一张,子类设计为分表)
(3)设计一张共有的属性,子类保存特有属性
//实现方式可以查找
7.树状映射(重要)
实体类设计:(parent表示父项)
id,name,Set<parent>,parent
在parent上@ManyToOne @JoinColumn(name="parent_id")
在Set上@OneToMany(mappedBy="parent")
--树状结构的打印
查询语言: NativeSQL(本地的sql语言)>HQL(hibernate query language)>EJB QL(JP QL 1.0)>QBC(Query By Cretira)>QBE(Query By Example)
HQL和EJB QL
session.createQuery("查询语句");
注明:category
1.from 类名
2.select distinct from 类名
3.from 类名 where id >:min and id<max
Query.setInteger("min",2);
Query.setInteger("max",2);
Query.setParameter("max",3);
Query.setMaxResults(4); //最大结果集
Query.setFirstResult(1); //读取的起点
Query.uniqueResult();
4.导航
from topic t where t.category.id=1
join // 联合查询
select t.tilte,c.name from topic t join t.category c
is not null //不为空
is empty //为空
like '%_' //模糊查询
本文由 程序员百味 http://www.bywei.cn/blog 编写
5.函数
lower()
upper()
trim()
concat()
length()
(不常用)
abs()
sqrt()
mod()
6.current_date 当前日期 current_time 当前时间 current_timestamp 当前日期和时间
7.查询
count()
group by
having
avg()
all()
exists() / not exists() //能用这个时就用这个
in() / not in()
8.session.getNameQuery("");
9.NativeQuery
SQLQuery q=session.createSQLQuery("本地sql语句").addEntity(类名.class);
10.QBE
Criteria c=session.createCriteria(类名.class).add(Restrictions.约束属性);
Hibernate 性能优化
1.session.clear() 分页时需要注意使用,打开了链接需要关闭
内存泄露,java语法上没有,而当加载许多的session时就会出现内存泄露
3.1+N问题(当取一张关联了其他表的数据时,将会加载其他的数据引发许多的sql语句)
取关联对象的值,将引发获取被关联的对象的值,这就是1+N问题
(1)@ManyToOne(fetch=FetchType.Lazy) //其他的被关联的对象语句将会在需要时发出
(2)@BatchSize(size=5) //只取五条数据,注解添加到被关联的对象上面
(3)join fetch: session.createQuery("from Topic t left join fetch t.category c");
//使用了外连接,只发一条sql语句
4.list和iterator的区别
(1)iterator 先取id再取对象,重复使用时,先查找缓存,再查找数据库.
(2)list 获取所有,不会查找seesion,但会先保存到session中去
5.二级缓存和查询缓存(查询的是一样的数据)
一级缓存:session级别的缓存
二级缓存:sessionFactory级别的缓存
load默认使用二级缓存,iterator默认使用二级缓存
list默认往二级缓存加数据,但查询时不先查询二级缓存
二级缓存需要在配置文件中打开
缓存算法: lru,lfu,fifo
6.事务并发处理
a)acid
b)事务的隔离级别
相关学习文档:
分享到:
相关推荐
Struts2.0、Spring2.5和Hibernate3.2是Java开发中广泛使用的三...通过深入学习这些文档,开发者不仅可以掌握SSH框架的基本使用,还能了解到如何在实际项目中灵活运用这些框架,实现高效率、高质量的Java Web应用开发。
SSH框架是Java开发中常用的三大框架,包括Struts2、Spring和Hibernate,它们协同工作,为Web应用程序提供了模型-视图-控制器(MVC)架构的支持。这些框架各自有着独特的功能,结合使用能够极大地提高开发效率和代码...
总之,这份"Hibernate帮助中文文档SSH"是学习和掌握Hibernate及其在SSH架构下应用的宝贵资源。通过深入阅读和实践,开发者能够更好地理解和运用ORM技术,提高开发效率,创建出高效稳定的Java Web应用。
SSH框架,全称为Struts2、Spring和Hibernate的组合,是Java Web开发中常见的三大开源框架集成。这个压缩包文件"SSHdemo"提供了一个SSH框架搭建登录功能的示例,帮助开发者了解并实践如何整合这三个框架来构建一个...
SSH框架学习手册中提到的内容包括了Struts2框架的学习和其在MVC模式下的应用。MVC模式将应用分为视图、模型和控制器三部分,分别承担展示、业务逻辑处理和请求分发的职责。Java Web中可以通过Servlet、JSP、JavaBean...
通过学习这些文档和教程,开发者不仅可以掌握SSH框架的基本用法,还能了解到如何在实际项目中高效地整合和使用这些工具,提升Java Web开发能力。在不断变化的开发环境中,理解并熟练运用SSH框架,将有助于你构建出...
SSH框架,全称为Struts2、Spring和Hibernate的组合,是Java Web开发中常见的三大开源框架集成。这个项目源码提供了SSH整合的实践案例,特别适合初学者学习和理解Web应用的开发流程。 Struts2作为MVC(Model-View-...
一次下载,SSH2框架的搭建步骤 全部文档资料都有。 对于新手来说,独自完成一个完整正确的SSH框架可能是一个相当困难麻烦的事。...Myeclipse10下搭建SSH框架(图解)Struts2.1 + Spring3.0 + Hibernate3.3等
通过阅读这些参考文档,开发者不仅可以深入理解SSH框架的工作机制,还能学习到最佳实践和常见问题的解决方案。在阅读过程中,要特别关注各个框架间的交互,例如Spring如何管理Struts2和Hibernate的bean,以及如何...
SSM框架组合了Spring、Struts2和MyBatis,而SSH框架则由Spring、Struts2和Hibernate组成。这两个框架都是为了简化Java Web应用的开发流程,提高开发效率和代码质量。 Spring框架作为核心,提供了依赖注入(DI)和...
SSH框架是Java Web开发中的三大主流框架,包括Struts2、Spring和Hibernate。这些框架各自承担着不同的职责,协同工作以...通过深入学习和实践这份文档,开发者可以更熟练地掌握SSH框架,提升自己的Java Web开发能力。
7. **进阶知识**:除了基础的SSH框架应用,你还可以学习Spring Boot、MyBatis等现代框架,以及Spring Cloud等微服务架构,这些都能帮助你在Java开发领域不断提升。 总之,SSH框架是Java Web开发中的经典选择,它的...
关于提供的压缩包文件,虽然没有直接包含SSH框架相关的代码或文档,但我们可以推测其中可能包含了一些辅助资源。例如: - `ReadMe.txt`:通常会提供项目的基本信息、安装指南或使用注意事项。 - `下载字体.url`:...
SSH框架,全称为Struts2、Spring和Hibernate的组合,是Java Web开发中常见的三大开源框架集成。这些框架协同工作,提供了模型-视图-控制器(MVC)架构,简化了开发过程,提高了代码的可维护性和重用性。下面我们将...
这个"ssh框架整合完整版"包含了这三个框架的集成示例,以及相关的学习文档和一个登录实例,帮助开发者更好地理解和掌握SSH框架的使用。 1. **Struts**:Struts是一个基于MVC(Model-View-Controller)设计模式的Web...
通过深入学习这个SSH框架课件及相关API文档,开发者可以系统地掌握SSH框架的全貌,提升在企业级Java应用开发中的能力。无论是初学者还是有经验的开发者,都能从中受益,提升自己的技能水平。在实际开发中,理解并...
在文档提供的信息中,作者雷筱珍通过“完全基于注解方式SSH框架项目设计”这篇文章,向读者详细阐述了SSH框架项目设计中注解应用的具体方法。文章中提到的参考文献,如《Struts, Hibernate, Spring集成开发宝典》和...
【基于SSH框架的文档管理的系统】是一种使用Java技术栈,特别是Struts、Spring和Hibernate(SSH)框架构建的企业级文档管理系统。系统旨在解决企业中非结构化数据管理的问题,这些数据通常占企业全部信息的80%,并且...