hibernateWord下载.docx
《hibernateWord下载.docx》由会员分享,可在线阅读,更多相关《hibernateWord下载.docx(14页珍藏版)》请在冰豆网上搜索。
@Table(name=表名)当类名与表名不同时
@Transient类中的某个属性不需要存入表中时
@Column(name=列名)类中某个属性名与表中对应的字段名不同
@Temporal(TemproalType)格式化Date的类型日期与时间的区别
@Enumerated(EnumType)映射枚举类型
在@Id下面加上@GeneratedValue设置主键的属性
字段映射位置,最好放在get方法上,放在field上破坏了面向对象的思想。
保持field和get,set方法一致
六.ID的生成策略。
①Xml文档里,设置id里generator中class的类型
②Annotation里通过@GeneratorValue设置主键的属性
③TableGenerator跨数据库平台的作用
@javax.persistence.TableGenerator(
name="
Teacher_GEN"
table="
GENERATOR_TABLE"
pkColumnName="
pk_key"
//注意不要与数据库中的关键字相同
valueColumnName="
pk_value"
pkColumnValue="
Teacher"
allocationSize=1//增量
)
同时:
@GeneratedValue(strategy=GenerationType.TABLE,generator="
)
组合ID
XML方式:
1.编写一个类,类中属性代表主键组合;
2.在XXX.hbm.xml里设置<
composite-id>
中的元素及其属性;
3.注意1中编写的类必须实现序列化接口,java.io.Serializable,同时重写booleanequals(Objecto)和inthashCode()方法;
Annotation里的组合ID
1.设定组合类TeacherPK为@Embeddedable,并在Teacher类中的组合属性注释为@Id即可;
2.直接在Teacher类中的组合属性注释为@EmbeddedId;
设定组合类TeacherPK
3.将Teacher类设置为@IdClass(value=Class名),并在相应的属性上注释为@Id即可;
(常用)设定组合类TeacherPK,该类必须实现Serializable接口,重载equal()和hashC()方法;
七.核心类
1.sessionFactory
i.配置文件名不为hiernate.hbm.xml时,可以通过configure方法指明路径;
ii.每个应用sessionFactory;
iii.Session的获得:
1.openSession()每次都获得一个新的session,且获得的session不同,需要close;
2.getCurrentSession()session未commit之前,得到的session是相同的,否则不同,自动close;
使用这个得到的session可以防止数据存储的不一致性,这个还需要自己实践才能完全明白;
3.NoCurrentSessionContextconfigured这个错误是因为
Hibernate.hbm.xml<
current_session_context_class"
thread<
current_session_context_class(jta[javatransactionAPI],thread)前者主要用于分布式数据库上,tomcat不能完成。
Junit测试时,报“Invalidprojectspecified的错误时,一般是由于project的名称中有非法字符或是前置空格造成的!
!
八.对象的三种状态
ⅰ.transient内存中的一个对象,没有id,缓存中也没有
ⅱ.persistent缓存中,数据库中也有,有id
ⅲ.detached缓存中没有对象,数据库中有,有id
九.Session方法
1.save();
2.delete();
3.load()和get()的区别
ⅰ.load返回的是一个对象的代理,返回时并未执行sql语句,而是在真正用到这个对象时才发出sql语句;
ⅱ.get直接从数据库加载,不存在延迟;
ⅲ.在session关闭之前,对不存在的记录的反应不一样。
get报的是NullPointerException的错误,而load报的是org.hibernate.ObjectNotFoundException:
Norowwiththegivenidentifierexists:
[com.hibernate.model.Teacher#7],get在对象应用之前依然发出sql语句但是并不报错。
4.upate();
更新detached对象后转变为pesistent对象;
更新transient对象时必须设置id(前提是数据库中已经存在),更新后其他属性都变为NULL(发出了其他属性一起改的sql语句)
更新persistent对象时,发现有与数据库中相应记录不同的数据时,才会发出其他属性一起改的sql语句,但是在数据库中只修改了更新的属性(因为session缓存与数据库有同步的效果,session关闭时会将缓存里的数据与数据库中的数据进行比较,有不同则修改)
只更新部分更改字段:
ⅰ.xml中property字段设置update的属性;
Annotation中设置属性@Column(updatable);
(很少使用)
ⅱ.xml中将class里的dynamic-update属性设置为true;
ⅲ.persistent对象更新时不需要update。
对同一个persistent对象,在不同session里update时,发出的sql语句不同。
改了那个属性就发哪个,针对persistent对象,才有比较
ⅳ.通过merge方法实现跨session更新部分字段;
ⅴ.HQL(EJFQL)Queryqq.createQuery
5.saveOrupdate();
6.clear()和flush()
Clear()清除缓存;
flush()强制内存与数据库一致。
7.SchemaExport
十.关系映射
1.一对一单向外键关联
引用->
@OneToOne(指定一对一关系)->
@joinColumn(name=)(指定外键名)
双向;
xml里写明<
many-to-onename="
s"
column="
studentId"
unique="
true"
/many-to-one>
2.一对一双向外键关联
在两个Entity类中分别引用对方,分别注释@OneToOne,但是必设属性mappedBy=?
,?
为另一个类中的get值。
Xml中,还必须在对应的类中进行引用,并添加<
one-to-onename=”对方对象在该类中的引用名”property-ref=”对方类中本类对象的引用名”/>
3.一对一单向主键关联
Annotation:
在@<
one-to-one>
下注释@PrimaryKeyJoinColumn即可,但是并为生成外键
Xml里:
分别配置<
属性注意constrained属性以及generator的class属性
4.一对一双向主键关联
分别引用;
@<
@PrimaryKeyJoinColumn
两个<
5.联合主键关联,见项目hibernate_08_uni_pk_composite@JoinColumns
6.组件映射
@Embedded@Embeddedable@AttributeOverrides
component/>
7.many-to-one单向
Annotation:
多方加上@many-to-one
在多方xml文件里加上<
many-to-one/>
8.one-to-many单向
在一方里加上@one-to-many此时在数据库中会生成一张关联表
在@one-to-many后加上@joinColumn可以解决问题
在一方加上;
<
setname="
set"
<
keycolumn="
s_id"
/key>
one-to-manyclass="
Course"
/>
/set>
9.one-to-many&
many-to-one双向
在一方和多方分别加上@one-to-many,@many-to-one,注意在多方设置@joinColumn,而在一方设置mappedBy属性;
在一方和多方的xml文件里分别加上
和<
many-to-one>
注意column名字与key名字相同;
10.many-to-many单向
只在拥有的多方加上
@ManyToMany
@JoinTable(name="
t_s"
joinColumns={@JoinColumn(name="
teacher_id"
)},
inverseJoinColumns={
@JoinColumn(name="
student_id"
}
)
只在拥有的一方加上相应的xml配置:
<
students"
many-to-manyclass="
Student"
十一.关联关系中的CRUD
1.设定cascade可以在持久化对象时对关联对象的操作;
2.铁律:
双向关系设定双向关联
3.铁律:
双向mappedBy
取值时:
4.在双向:
@many-to-one在多方级联取值不用设置cascade;
5.在双向:
@one-to-many在一方级联取值必须设置fetch;
6.update时,打破双向关联可以只删除必要数据,设定关系为null或者
session.createQuery("
deletefromCoursecwherec.id=1"
).executeUpdate();
十二.集合映射
1.在一方使用List,注意@OrderBy属性;
2.在一方使用Map,注意@mapKey属性。
继承映射
1.singletable
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="
discriminator"
discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue("
person"
2.TableperClass
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@TableGenerator(
name="
t_gen"
table="
t_gen_table"
pkColumnName="
t_pk"
valueColumnName="
t_value"
pkColumnValue="
person_pk"
initialValue=1,
allocationSize=1
3.
作业:
树状结构的设计(重要)见项目hibernate_19_tree
1.在同一个类中使用one2many和many2one
学生,课程,分数设计表见项目hibernate_20_stu_course_score
十三.hibernate查询,见项目hibernate_21_QL_1hibernate_22_QL_2。
十四.hibernate性能优化
1.1+N问题
ⅰ.设定FetchType的属性
ⅱ.@BatchSize
ⅲ.joinfetch
2.list和Iterate
⑴list直接取出所有,iterate先取出id,用到时再取出对象。
⑵list重复取时直接从数据库里取,而iterate则是先从缓存开始查找
3.一级缓存,二级缓存,查询缓存(面试题)
一级缓存:
session级别
⑴二级缓存配置:
sessionFactory级别的缓存
a.在hibernate.hbm.xml中加入:
以打开二级缓存
property
name="
cache.use_second_level_cache"
true<
cache.provider_class"
org.hibernate.cache.EhCacheProvider<
b.在需要存入缓存的实体上注释@Cache
c.拷入ehcache.xml
d.加入ehcachejar包
e.加入commons-loggingjar包
⑵如果Query要用二级缓存,需要打开查询缓存:
cache.use_query_cache"
调用Query的setCacheable(true)
⑶缓存算法:
LRU(LeastRecentlyUsed)
LFU(LeastFrequentlyUsed)
FIFO(FisrtinFirstout)
memoryStoreEvictionPolicy=”LRU”
4.悲观锁,乐观锁(面试)
悲观锁:
load()中设置LockMode属性
乐观所:
@Vesion
实践时需要注意的地方:
1.在设置多对多关联时:
两方都不加mappedBy的话,删除一方则会删除相应中间表里的记录;
注意思考一下cascade的位置和作用
packagecom.znufe.model;
importjava.io.Serializable;
importjava.util.Date;
importjava.util.List;
importjavax.persistence.CascadeType;
importjavax.persistence.Entity;
importjavax.persistence.GeneratedValue;
importjavax.persistence.GenerationType;
importjavax.persistence.Id;
importjavax.persistence.JoinColumn;
importjavax.persistence.JoinTable;
importjavax.persistence.ManyToMany;
importjavax.persistence.ManyToOne;
importjavax.persistence.OneToOne;
importjavax.persistence.Temporal;
importjavax.persistence.TemporalType;
/**
*@authorAdministrator
*/
@Entity
publicclassUserimplementsSerializable{
/**
*
privatestaticfinallongserialVersionUID=6144487866451148422L;
privateintid;
privateStringusername;
privateStringpassword;
privateStringrealName;
privateStringemail;
privateDatecreateTime;
privateOrganizationorg;
privateRolerole;
privateList<
Course>
courses;
@ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE})
@JoinTable(
name="
u_c"
user_id"
inverseJoinColumns={@JoinColumn(name="
kch"
),@JoinColumn(name="
kxh"
)}
publicList<
getCourses(){
returncourses;
}
publicvoidsetCourses(List<
courses){
this.courses=courses;
//@OneToOne(cascade=CascadeType.ALL)
//@PrimaryKeyJoinColumn
//一对一双向关联
@OneToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE})
@JoinColumn(name="
role_fk"
publicRolegetRole(){
returnrole;
publicvoidsetRole(Rolerole){
this.role=role;
//双向关联
@ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE})
org_id"
publicOrganizationgetOrg(){
returnorg;
publicvoidsetOrg(Organizationorg){
this.org=org;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
publicStringgetPassword(){
returnpassword;
publicvoidsetPassword(Stringpassword){
this.password=password;
publicStringgetUsername(){
returnusername;
publicvoidsetUsername(Stringusername){
this.username=username;
publicStringgetRealName(){
returnrealName;
publicvoidsetRealName(Stringname){
this.realName=name;
@Temporal(TemporalType.TIMESTAMP)
publicDategetCreateTime(){
returncreateTime;
publicvoidsetCreateTime(Datecrea