SSHHibernate.docx
- 文档编号:3931787
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:21
- 大小:134.39KB
SSHHibernate.docx
《SSHHibernate.docx》由会员分享,可在线阅读,更多相关《SSHHibernate.docx(21页珍藏版)》请在冰豆网上搜索。
SSHHibernate
Øhibernate.cfg.xml:
--Databaseconnectionsettings-->(连接配置)
mysql:
//localhost:
3306/hibernate
--JDBCconnectionpool(usethebuilt-in)-->(连接池)
--
--SQLdialect-->(SQL方言)
--EnableHibernate'sautomaticsessioncontextmanagement-->
--
--Disablethesecond-levelcache-->(二级缓存)
--EchoallexecutedSQLtostdout-->(显示SQL)
--Dropandre-createthedatabaseschemaonstartup-->
--
Ø简单使用Hibernate:
创建对应的数据库和实体类,在实体类同一包下,创建Xxx.hbm.xml,(hibernate映射文件),并在hibernate.cfg.xml中写明配置。
Xxx.hbm.xml:
--表映射,名字一样可只写name属性-->
--主键映射-->
(不使用的属性不写即可,如果使用xml方式映射枚举类型将十分复杂)
hibernate.cfg.xml:
Ø常用注解:
(属性的Annotation一般加在get方法上,因为属性本身是private,如果加上Annotation,表示Hibernate可以直接访问,破坏了私有的特性)
@Entity(javax.persistence包)注释表示当前类为实体类;
@Id(javax.persistence包)表示主键,一般加在get方法上;
@Table(name="xxx")(javax.persistence包)指定数据库中的表名;
@Column(name="xxx")(javax.persistence包)指定字段名,有多种属性,比如指定字段的长度;
@Basic(javax.persistence包)所有属性默认的Annotation;
@Transient(javax.persistence包)不进行persistence的属性;
@Temporal(TemporalType.DATE/TIMESTAMP/TIME)(取值有3种)指定时间类对应的字段类型;
@Enumerated(EnumType.STRING/ORDINAL)(取值有2种)映射Enum枚举类型,STRING表示作为字符串映射,ORDINAL表示作为数字下标映射;
ØMyEclipse修改自动提示相关:
Ø常用配置属性:
(可选参数:
validate检查表是否对应、update自动更新表结构、create没表自动创建、create-drop在显式关闭SessionFactory时,将删除掉);
Ø理论上先建类,再建表;实际一般是先建表,后建类;
Ø使用JUnit测试,最好建立一个新的SourceFolder,并在下边建立与src中对应的包来测试对应的类;
ØJUnit中常用的Annotation:
@Before:
初始化方法;
@After:
释放资源;
@Test:
测试方法,在这里可以测试期望异常和超时时间;
@Ignore:
忽略的测试方法;
@BeforeClass:
针对所有测试,只执行一次,且必须为staticvoid;
@AfterClass:
针对所有测试,只执行一次,且必须为staticvoid;
Ø一个JUnit4的单元测试用例执行顺序为:
@BeforeClass–>@Before–>@Test–>@After–>@AfterClass;
Ø每一个测试方法的调用顺序为:
@Before–>@Test–>@After;
Ø使用Junit测试时,如果hibernate.cfg.xml配置有误,可能引发测试bug,即不提示异常,此时,在BeforeClass方法中使用try-catch,或者使用main方法调用BeforeClass中方法,都是差错的手段;
ØID生成策略:
Ø使用xml配置字段时,配置字段主键自增长:
(常用取值:
native、identity、sequence、uuid)
Ø使用Annotation配置字段主键自增长:
@GeneratedValue(strategy=GenerationType.AUTO/IDENTITY/SEQUENCE/TABLE)(不写默认为AUTO);
Ø使用Annotation配置字段主键自增长(sequence方式):
@SequenceGenerator(name="teacher_seq",sequenceName="teacher_seq")(在类上进行注释)
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacher_seq")(get方法注释)
这样可以指定生成的sequence;
Ø使用Annotation配置字段主键自增长(table方式):
@TableGenerator(name="teacher_table",table="gen_table",pkColumnName="_key",valueColumnName="_value",pkColumnValue="teacher",allocationSize=1)
@GeneratedValue(strategy=GenerationType.TABLE,generator="teacher_table")
(用于跨数据库平台,与sequence类似,但是不常用)
Ø联合主键:
xml配置:
定义主键的组件类:
StudentPK,实现Serializable,覆写hashCode、equals;
Annotation配置:
组件类注解为@Embeddable,组件属性注解为@Id;
组件属性注解为@EmbeddedId;(常用)
将类注解为@IdClass,所有属于主键的属性注解为@Id(@IdClass(XxxPK.class)传入组件类);(常用)
ØSessionFactory对象有openSession()和getCurrentSession()两种方法取得Session,但是openSession()永远是打开新的Session,而getCurrentSession()则是首先看当前上下文(配置中必须定义)是否存在已打开的Session并引用(Session进行commit()之前,取多少次仍然是同一个Session),然后才打开新的Session,使用getCurrentSession()可以方便的完成事务的操作,界定事务的边界(commit之前使用同一个Session);
ØopenSession()之后,使用完毕要close;而getCurrentSession(),commit()之后,自动close;另外,两种方式不能混用;
Ø上下文配置:
(取值:
jta、thread、managed、自定义,后两个很少用到)
Ø对象的三种状态:
(瞬态、持久态、游离态)
transient:
内存中一个对象,没ID,缓存中也没有;
persistent:
内存中有,缓存中有,数据库有(ID);
detached:
内存有,缓存没有,数据库有,ID;
Ø三种状态的区分关键在于:
有没有ID;在数据库中有没有;在内存中有没有(session缓存);
ØSession常用方法:
save、delete、get、load、update、saveOrUpdate、clear、flush
Øget与load的区别(面试重点,原理):
不存在对应记录时表现不一样;load返回的是代理对象,等到真正用到对象的内容时才发出sql语句;get直接从数据库加载,不会延迟;(最典型问题就是使用load在关闭Session之后会有异常);
Øupdate(更新transient对象会报错)
用来更新detached对象,更新完成后转为persistent状态;也可以更新自己设定id的transient对象(数据库有对应记录);persistent状态的对象只要修改字段内容(与原来的值不同),就会自动发生更新;
Øupdate时,默认是全部字段更新,也可以更新部分更改的字段:
xml设定property标签的update属性,annotation设定@Column的updatable属性,不过这种方式很少用,因为不灵活(忘记)
使用xml中的dynamic-update,JPA1.0Annotation没有对应的属性,hibernate扩展(同一个session可以,跨session不行,不过可以用merge()(合并:
先select之后判断哪个字段修改,然后update修改字段))(不重要)
xml设置:
使用HQL(EJBQL)(建议)
Øclear:
无论是load还是get,都会首先查找缓存(一级缓存),如果没有,才会去数据库查找,调用clear()方法可以强制清除session缓存;
Øflush:
强制将内存(session缓存)与数据库发出语句同步。
默认情况下是session的事务提交(commit)时才同步;(session的FlushMode设置,可以设定在什么时候同步缓存与数据库(在开始事务之前设置,很少用)例如:
session.setFlushMode(FlushMode.AUTO));
Ø测试建表的方法:
newSchemaExport(newAnnotationConfiguration().configure()).create(false,false);(第一个参数是是否在控制台打印语句,第二个是是否立即执行);
Ø关系映射:
(重点)
Ø一对一单项外键关联:
Annotation:
@OneToOne
@JoinColumn(name="w_id")//指定生成的数据库字段名
publicWifegetWife(){
returnwife;
}
xml:
unique="true"是保证生成的字段唯一,这样many-to-one也达到了一对一的效果;
Ø一对一双向外键关联:
Annotation:
@0neTo0ne(mappedBy="另一个类里定义的属性名")//表示该一对一双向关系的对应映射属性
规律:
凡是双向关联,必设mappedBy;
@OneToOne(mappedBy="wife")
publicHusbandgetHusband(){
returnhusband;
}
xml:
在Student类中写StuIdCard属性,StuIdCard类中写Student属性;StuIdCard.hbm.xml文件中加
Student.hbm.xml文件中加
特别说明:
一对一单向外键关联与一对一双向外键关联在数据库的表的格式是一样的,区别在于java程序中:
双向外键关联可通过Hibernate在两个类间互相调用彼此,而单向外键关联只能单方向调用。
Ø一对一单项主键关联:
(不重要)
Annotation:
@PrimaryKeyJoinColumn(不常用,了解);
xml:
Ø一对一双项主键关联:
(不重要)
Annotation:
@PrimaryKeyJoinColumn(不常用,了解);
xml:
另一个类的配置文件加入
Ø联合主键:
Annotation:
@OneToOne
@JoinColumns({@JoinColumn(name="wifeid",referencedColumnName="id"),
@JoinColumn(name="wifename",referencedColumnName="name")})
Ø组件映射:
(对象关系:
一个对象是另外一个对象的一部分;一张表)
Annotation:
@Embedded
//表示嵌入的对象
publicWifegetWife(){
returnwife;
}
(Wife类不需要使用任何注解,但是要避免重名问题)
@AttributeOverride注解需要写在getWife方法上,可以重新指定生成的Wife类组件生成的字段名。
例如:
Husband与Wife两个类中都有name字段,这样在生成表的时候会有冲突,此时采用@AttributeOverride注解可以指定Wife类中的name属性对应新的字段名“wifename”,不过@AttributeOverride注解不常用,因为有更好的解决方法:
不要在组件的两个映射类中写同名属性;如果真的有重复,那么可以在分类中(此处为Wife类)的重复名称的属性上使用如下内容以指定新的字段名:
@Column(name="wifename")
publicStringgetName(){
returnname;
}
另外,@Embeddable是写在分类(Wife类)的类名前的,不过好像不写也行;
@Embeddable
publicclassWife{……}
xml:
Ø多对一关系数据库设计:
在多的一方加外键;
Ø多对一单项关联:
Annotation:
@ManyToOne
//多对一关系
@JoinColumn(name="gid")
publicGroupgetGroup(){
returngroup;
}
xml:
标签会在“多”的一端添加外键,相当于在数据库中添加外键
属性cascade:
取值all、none、save-update、delete,对象间的级联操作,只对增删改起作用;在存储时User时,设置了cascade="all"会自动存储相应的t_group,而不用管user关联的对象(通常情况下会优先存储关联的对象,然后再存储user);
Ø一对多单项关联:
Annotaion:
@OneToMany
@JoinColumn(name="gid")//会加在多的那一方
publicSet
returnusers;
}
(Hibernate默认将OneToMany理解为ManyToMany的特殊形式,如果不指定生成的外键列@JoinColumn,则会默认生成多对多的关系,产生一张中间表);
xml:
配置中配置一的那一端(Group)
Ø一对多(多对一)双向关联:
Annotation:
多的一端:
@ManyToOne
@JoinColumn(name="gid")
publicGroupgetGroup(){
returngroup;
}
一的一端:
@OneToMany(mappedBy="group")
publicSet
returnusers;
}
xml:
Group中:
User中:
务必确保在多的一端生成的外键和一的一方生成的外键的名字相同,否则会生成多余的外键;
Ø多对多关系数据库设计:
建立中间表;
Ø多对多单向关联:
Annotation:
@ManyToMany
@JoinTable(name="t_s",
//中间表名
joinColumns={@JoinColumn(name="t_id")},
//当前类在中间表的外键名字
inverseJoinColumns={@JoinColumn(name="s_id")})
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SSHHibernate