hibernate小记
2015-01-30 13:18
204 查看
1.不映射到数据库里 :@transient (annotation中),不写(xml中)
2.更改日期精度:@temporal(temporal.Date), type="date"
3.映射枚举类型:@Enumerated(EnumType.STRING) --EnumType.ORDINAL (枚举的下标值)
4.ID生成策略:@GenerateValue(strategy=GenerationType.IDENTITY) --auto;Identity;sequence --@SequenceGenerator ;table --TableGenerator ,<generator class="uuid"> -- identity(MySql) sequence(Oracle)
native(由底层方言产出);
类上加 :@SequenceGenerator(name="xxxSequence",sequencename="xxxSequence_DB"),get方法上加
GenerateValue(strategy=GenerationType.SEQUENCE,generator="xxxSequence") ---指定生成的序列名以及指定所用的序列
5.联合主键:(1)新建一个类用于存放把主键 (2)实现java.io.Serializable(标记行接口,不用实现任何方法) --内存若满,需要实现序列化,才能够写到虚拟内存 (3)重写equals和hashcode
5.1 把主键类注解为@Embeddable,并且把组件属性注解为@Id
5.2 把组件属性注解为@EmbeddedId
5.3将类注解为@IdClass(XXX.class),且将复合id的get方法都设为@id (常用)
<composite-id name="pk" class="">
<key-property name="id"></key-property-id>
</composite-id>
6.opensession 始终打开一个新的session,需要手动close
getcurrentsession 在上下文中查找session,若没有,则创建,用途:用于界定事物边界,自动close
7.hibernate.current_session_context_class 取值有:jta java Transaction api | thread 线程 | managed 手工管理事物 | custom.class 自定义class管理事物
8.hibernate对象的三种状态:Transient (瞬态--内存中的一个对象,没id,缓存中没有) Persistent(持久-- 内存中有,缓存中有,有id,数据库有) Detached(托管--内存有,缓存有,数据库有,有id)
三种状态的区别在于1.有没有id 2.id在数据库中有没有 3.在内存中有没有(session缓存)
9.session--》接口,管理一个数据库的任务单元
10. save() Transient==>Persistent
delete() 必须要有id Persistent==>Transient
Load(Class,id) Persistent
get(Class,id) 与load()的区别 使用get时候,会马上发出sql语句,获取对象,而使用load()时候,只会先获得一个代理,在需要使用的时候才会发出sql语句
update() ---更新Transient对象会报错,但是有id的Transient对象不会报错
===============更新部份修改的字段
(1)修改注解,在get方法上,@Column(updatable=false)
(2)在xml文件的<class上增加 dynamic-update="true"> --跨session时不顶用==》加上session.merge(对象)
(3)使用HQL语句
Query q=session.createQuery("HQL");
q.executeUpdate();
clear(): 无论load()或get(),都首先会查找缓存(一级缓存),如果没有,才会去数据库数据库查找,对用clear()方法可以强制清除session缓存
flush():强制让缓存的内容与数据库的内容作同步 FlushMode
11.schemaeExport(Configuration) 生成建表语句
12 一对一关系
(1)单向外键关联:
在一个类中有另一个类的引用
@onetoone
<mang-to-one name="" column="" class="" unique="true">
改变生成的外键id名字:@JoinColunm(name="XXX")
(2)双向外键关联
A类中有B类的引用,B类中有A类的引用
两个属性上同时写上@onetoone
这时,若生成表,则会有两个外键,产生冗余,可以在其中一个的@onetoone改为@onetoone(mappedby=“”)
只要有双向关联,mapped属性必设
<mang-to-one name="A" column="" class="" unique="true">
<one-to-one name="" column="" class="" property-ref=“A”>
(3)单向主键关联
在一个类中增加另一个类的引用
在属性上增加以下注解
@onetoone
@PrimaryKeyJoinColumn
<one-to-one name="" constrained="true">
(4)双向主键关联
A类有B类的引用,B类有A类的引用
@onetoone
@@PrimaryKeyJoinColumn
<one-to-one name="" column="" class="" property-ref=“A”>
(5)联合主键
A类中有B类的引用
在getXXX方法上加上:@onetoone
@joinColumns({
@joinColumn(name="",referencedColumn=""),
@joinColumn(name="",referencedColumn="")
})
(6)组件映射
在get方法上写@Embedded
<component name="">
<property name=""></property>
<property name=""></property>
</component>
(7)多对一的单向关联
在多的一方加上另一方的引用
在getXXX上增加以下注解:
@manytoone
@joinColumn(name="")
<many-to-one name="" column=""/ >
(8)一对多的单向关联
在一方存在多的一方的引用:Set<泛型>
在getXXX方法上加上:@onetomany 在默认的情况下会被当前多对多的特殊情况,生成3张表,一张为中间表
再加@joinColumn(name="") 加上此注解,会在数据库表里,多的一方加上外键
<set name="">
<key column=“”>
<one-to-many class="" >
</set>
(9)一对多,多对一双向关联
在双方都有对方的引用
在一的一方:
@onetomany(mapped=“”)
在一的一方:
<set name="">
<key column=“”>
<one-to-many class="" >
</set>
在多的一方:
<many-to-one name="" column=""> ==>column 相当于FK名字
(9)多对多关联
单向关联:
一方拥有另一方的引用
@manytomany
<set name="" table=“”>
<key column=“”>
<many-to-many class="" column=“” >
</set>
(10)多对多关联
双方各有对方的引用
@manytomany(mapped="")
<set name="" table=“”>
<key column=“”>
<many-to-many class="" column=“” >
</set>
13保存时(save()).默认情况下,不产生级联关系
可在引用getXXX方法上加上以下注解
可设置@manytoone(cascade={cascadeType.All})
CascadeType.REFRESH:级联刷新,当多个用户同时作操作一个实体,为了用户取到的数据是实时的,在用实体中的数据之前就可以调用一下refresh()方法!
CascadeType.REMOVE:级联删除,当调用remove()方法删除Order实体时会先级联删除OrderItem的相关数据!
CascadeType.MERGE:级联更新,当调用了Merge()方法,如果Order中的数据改变了会相应的更新OrderItem中的数据,
CascadeType.ALL:包含以上所有级联属性。
(注:以上几种级联操作,只能实在满足数据库的约束时才能生效,比如上边的Order和OrderItem存在主外键关联所以执行REMOVE()方法时是不能实现级联删除的)
CascadeType.PERSIST:级联保存,当调用了Persist() 方法,会级联保存相应的数据
双向关系要在程序中设置双向关联
14.查询时,manytoone,在多方,可以把一的那方取出来,在一方,不会将多方取出
@onetomany(fetch=FetchType.eager)
15.Update
<set name="" inverse="true"> // 逆转,关联关系在对方那边设,取我,就不用取对方,取对方,就不用取我
<key column=“”>
<many-to-many class="" column=“” >
</set>
16.Merge=save()+update
17.(1)为了防止级联删除,可以打破关系 (2)可用hql
18.集合映射
使用Set与list的区别在 于排序,当需要进行排序时,使用List
加注解:默认按主键@Orderby
@Orderby(name ASC)
Map:使用Map时需要加上以下注解:@MapKey(name="")
19.继承映射
(1)single_table模式:
在父类中:
在子类中:
(2)每个具体的类一张表:
父类:
ID生成策略要么使用table,要么手动
子类:不用设
(3)joined模式
子类:不用写
20. NativeSQL(本地SQL)>HQL>EJBQL(JPQL)>QBC(Query By Cretira)>QBE(Query By Example)
2.更改日期精度:@temporal(temporal.Date), type="date"
3.映射枚举类型:@Enumerated(EnumType.STRING) --EnumType.ORDINAL (枚举的下标值)
4.ID生成策略:@GenerateValue(strategy=GenerationType.IDENTITY) --auto;Identity;sequence --@SequenceGenerator ;table --TableGenerator ,<generator class="uuid"> -- identity(MySql) sequence(Oracle)
native(由底层方言产出);
类上加 :@SequenceGenerator(name="xxxSequence",sequencename="xxxSequence_DB"),get方法上加
GenerateValue(strategy=GenerationType.SEQUENCE,generator="xxxSequence") ---指定生成的序列名以及指定所用的序列
5.联合主键:(1)新建一个类用于存放把主键 (2)实现java.io.Serializable(标记行接口,不用实现任何方法) --内存若满,需要实现序列化,才能够写到虚拟内存 (3)重写equals和hashcode
5.1 把主键类注解为@Embeddable,并且把组件属性注解为@Id
5.2 把组件属性注解为@EmbeddedId
5.3将类注解为@IdClass(XXX.class),且将复合id的get方法都设为@id (常用)
<composite-id name="pk" class="">
<key-property name="id"></key-property-id>
</composite-id>
6.opensession 始终打开一个新的session,需要手动close
getcurrentsession 在上下文中查找session,若没有,则创建,用途:用于界定事物边界,自动close
7.hibernate.current_session_context_class 取值有:jta java Transaction api | thread 线程 | managed 手工管理事物 | custom.class 自定义class管理事物
8.hibernate对象的三种状态:Transient (瞬态--内存中的一个对象,没id,缓存中没有) Persistent(持久-- 内存中有,缓存中有,有id,数据库有) Detached(托管--内存有,缓存有,数据库有,有id)
三种状态的区别在于1.有没有id 2.id在数据库中有没有 3.在内存中有没有(session缓存)
9.session--》接口,管理一个数据库的任务单元
10. save() Transient==>Persistent
delete() 必须要有id Persistent==>Transient
Load(Class,id) Persistent
get(Class,id) 与load()的区别 使用get时候,会马上发出sql语句,获取对象,而使用load()时候,只会先获得一个代理,在需要使用的时候才会发出sql语句
update() ---更新Transient对象会报错,但是有id的Transient对象不会报错
===============更新部份修改的字段
(1)修改注解,在get方法上,@Column(updatable=false)
(2)在xml文件的<class上增加 dynamic-update="true"> --跨session时不顶用==》加上session.merge(对象)
(3)使用HQL语句
Query q=session.createQuery("HQL");
q.executeUpdate();
clear(): 无论load()或get(),都首先会查找缓存(一级缓存),如果没有,才会去数据库数据库查找,对用clear()方法可以强制清除session缓存
flush():强制让缓存的内容与数据库的内容作同步 FlushMode
11.schemaeExport(Configuration) 生成建表语句
12 一对一关系
(1)单向外键关联:
在一个类中有另一个类的引用
@onetoone
<mang-to-one name="" column="" class="" unique="true">
改变生成的外键id名字:@JoinColunm(name="XXX")
(2)双向外键关联
A类中有B类的引用,B类中有A类的引用
两个属性上同时写上@onetoone
这时,若生成表,则会有两个外键,产生冗余,可以在其中一个的@onetoone改为@onetoone(mappedby=“”)
只要有双向关联,mapped属性必设
<mang-to-one name="A" column="" class="" unique="true">
<one-to-one name="" column="" class="" property-ref=“A”>
(3)单向主键关联
在一个类中增加另一个类的引用
在属性上增加以下注解
@onetoone
@PrimaryKeyJoinColumn
<one-to-one name="" constrained="true">
(4)双向主键关联
A类有B类的引用,B类有A类的引用
@onetoone
@@PrimaryKeyJoinColumn
<one-to-one name="" column="" class="" property-ref=“A”>
(5)联合主键
A类中有B类的引用
在getXXX方法上加上:@onetoone
@joinColumns({
@joinColumn(name="",referencedColumn=""),
@joinColumn(name="",referencedColumn="")
})
(6)组件映射
在get方法上写@Embedded
<component name="">
<property name=""></property>
<property name=""></property>
</component>
(7)多对一的单向关联
在多的一方加上另一方的引用
在getXXX上增加以下注解:
@manytoone
@joinColumn(name="")
<many-to-one name="" column=""/ >
(8)一对多的单向关联
在一方存在多的一方的引用:Set<泛型>
在getXXX方法上加上:@onetomany 在默认的情况下会被当前多对多的特殊情况,生成3张表,一张为中间表
再加@joinColumn(name="") 加上此注解,会在数据库表里,多的一方加上外键
<set name="">
<key column=“”>
<one-to-many class="" >
</set>
(9)一对多,多对一双向关联
在双方都有对方的引用
在一的一方:
@onetomany(mapped=“”)
在一的一方:
<set name="">
<key column=“”>
<one-to-many class="" >
</set>
在多的一方:
<many-to-one name="" column=""> ==>column 相当于FK名字
(9)多对多关联
单向关联:
一方拥有另一方的引用
@manytomany
@JoinTable( name="TrainedMonkeys", joinColumns = @JoinColumn( name="trainer_id"), inverseJoinColumns = @JoinColumn( name="monkey_id") )
<set name="" table=“”>
<key column=“”>
<many-to-many class="" column=“” >
</set>
(10)多对多关联
双方各有对方的引用
@manytomany(mapped="")
<set name="" table=“”>
<key column=“”>
<many-to-many class="" column=“” >
</set>
13保存时(save()).默认情况下,不产生级联关系
可在引用getXXX方法上加上以下注解
可设置@manytoone(cascade={cascadeType.All})
CascadeType.REFRESH:级联刷新,当多个用户同时作操作一个实体,为了用户取到的数据是实时的,在用实体中的数据之前就可以调用一下refresh()方法!
CascadeType.REMOVE:级联删除,当调用remove()方法删除Order实体时会先级联删除OrderItem的相关数据!
CascadeType.MERGE:级联更新,当调用了Merge()方法,如果Order中的数据改变了会相应的更新OrderItem中的数据,
CascadeType.ALL:包含以上所有级联属性。
(注:以上几种级联操作,只能实在满足数据库的约束时才能生效,比如上边的Order和OrderItem存在主外键关联所以执行REMOVE()方法时是不能实现级联删除的)
CascadeType.PERSIST:级联保存,当调用了Persist() 方法,会级联保存相应的数据
双向关系要在程序中设置双向关联
14.查询时,manytoone,在多方,可以把一的那方取出来,在一方,不会将多方取出
@onetomany(fetch=FetchType.eager)
15.Update
<set name="" inverse="true"> // 逆转,关联关系在对方那边设,取我,就不用取对方,取对方,就不用取我
<key column=“”>
<many-to-many class="" column=“” >
</set>
16.Merge=save()+update
17.(1)为了防止级联删除,可以打破关系 (2)可用hql
18.集合映射
使用Set与list的区别在 于排序,当需要进行排序时,使用List
加注解:默认按主键@Orderby
@Orderby(name ASC)
Map:使用Map时需要加上以下注解:@MapKey(name="")
19.继承映射
(1)single_table模式:
在父类中:
@Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn( name="planetype", discriminatorType=DiscriminatorType.STRING ) @DiscriminatorValue("Plane")
在子类中:
@Entity @DiscriminatorValue("A320")
(2)每个具体的类一张表:
父类:
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
ID生成策略要么使用table,要么手动
子类:不用设
(3)joined模式
父类中写: @Entity @Inheritance(strategy=InheritanceType.JOINED)
子类:不用写
20. NativeSQL(本地SQL)>HQL>EJBQL(JPQL)>QBC(Query By Cretira)>QBE(Query By Example)
相关文章推荐
- hibernate学习小记
- hibernate中集合映射关联映射小记
- myeclipse试用小记----Hibernate多对一双向关联(2)
- Hibernate 与 JPA 小记
- hibernate 未明确定义列 小记
- hibernate 小记
- Hibernate学习小记
- SpringData,Spring与Hibernate整合小记
- Hibernate使用小记
- Hibernate的使用中遇到的问题小记
- 项目中用hibernate容易出现错误的几个地方小记一下
- myeclipse试用小记----Hibernate多对一自身关联(3)
- hibernate 小记
- HibernateDaoSupport小记
- MyEclipse试用小记--五分钟搞定一个hibernate的web应用
- myeclipse试用小记----Hibernate多对一单向关联(1)
- 从Hibernate2到3移植的两点初体验
- hibernate 经验谈
- Hibernate 学习第一天
- 选择Hibernate还是iBatis?[转载]