hibernateWord下载.docx

上传人:b****6 文档编号:19366631 上传时间:2023-01-05 格式:DOCX 页数:14 大小:21.94KB
下载 相关 举报
hibernateWord下载.docx_第1页
第1页 / 共14页
hibernateWord下载.docx_第2页
第2页 / 共14页
hibernateWord下载.docx_第3页
第3页 / 共14页
hibernateWord下载.docx_第4页
第4页 / 共14页
hibernateWord下载.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

hibernateWord下载.docx

《hibernateWord下载.docx》由会员分享,可在线阅读,更多相关《hibernateWord下载.docx(14页珍藏版)》请在冰豆网上搜索。

hibernateWord下载.docx

@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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 社交礼仪

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1