.../〉
6参考文裆进行测试(注意文裆中缺少configure()的小bug)
7FAQ:
@不给提示
a)配置eclipse属性信息contentassist-activation--加上@
WhatisandWhy0/RMapping
1JDBC操作数据库很繁琐
2Sql语句编写并不是面向对象的
3可以在对象和关系表之间建立关联来简化编程
40/RMapping简化编程
50/RMapping跨越数据库平台
6Hibernate_0200_OR_Mapping_Simulation
0/RMappingFrameworks
1hibernate
2toplink
3jdo
4JPA接口(hibernate和其他是他的实现)
a)意愿统一天下
Hibernate基础配置
1对应项目:
Hibernate_0300_BasicConfiguration
2介绍MSQL的图形化客户端
3hibernate.cfg.xml:
hbmddl.auto:
create、update。
。
。
。
a)先建表还是先建实体类—先建表一般先表后类
4搭建日志环境并配置显示DDL语句
a)slf4j与log4j的关系:
slf4j像是一个大管家,可以管理许多的日志框架,log4j是其中之一
b)加入slf4j-log4j.jar,加入log4j的jar包,去掉slf4-nop.jar
c)从hibernate/project/etc目录copylog4j.properties
d)査询hibernate文裆,日志部分,调整日志的输出策略
5搭建jUnit环境
a)需要注意jUnit的Bug
6hibernate.cfg.xml:
show_sql是否输出SQL语句
7hibernate.cfg.xml:
format_sql格式化SQL语句,美化SQL语句
--格式化显示输出sql-->
true
8表名和类名不同,对表名进行配置
a)Annotation:
@Table
b)xml:
自己査询
9字段名和属性相同
a)不用写@column与默认的@Basic效果一样
b)Xml中不用写column
10字段名和属性名不同
a)Annotation:
@Column
b)xml:
自己査询
11不需要psersistence的字段(不用实例)
a)Annotation:
@Transient定义不写入数据库,属性透明
b)xml不写
12映射日期与时间类型,指定时间精度
a)Annotation:
@Temporal(参数)参数有3种只显示时间,只显示日期,时间日期都显示
//@Temporal(TemporalType.DATE)只显示日期
//@Temporal(TemporalType.TIME)只显示时间
//@Temporal(TemporalType.TIMESTAMP)显示日期与时间
b)xml:
指定type
13映射枚举类型(比较少用)
a)@Enumerated
@Enumerated(EnumType.ORDINAL)枚举类型按位置数,如:
0,1,2...存储
@Enumerated(EnumType.STRING)枚举类型按设定值存储
b)xml:
麻烦
14字段映射的位置(field或者get方法)
a)bestpractice:
保持field(变量定义)和getset方法的一致
15@Lob
16课外:
CLOBBLOB类型的数据存取
17课外:
Hibernate自定义数据类型
18hibernate类型
ID生成策略
1对应项目:
hibernate_0400_ID
2注意:
a)我们观察hibernate生成表的结构并不是为了将来就用它生成,(可能还有自己的扩展,比如index等)而是为了明白我们应该建立什么样的表和实体类映射
3xml生成id
a)generator
b)常用四个:
nativeidentitysequenceuuid
4注解方式:
@GeneratedValue
a)自定义ID
b)AUTO(直接写@GeneratedValue相当如native)(@GeneratedValue(strategy=GenerationType.AUTO))
i.默认:
对MySQL,使用auto_increment
ii.对Oracle使用hibernate_sequence(名称固定)
c)IDENTITY(@GeneratedValue(strategy=GenerationType.IDENTITY))
d)SEQUENCE(@GeneratedValue(strategy=GenerationType.SEQUENCE))
i.@SequenceGenerator(可自定义在数据库生成指定的sequence名)
@Id
//在@GeneratedValue中增加generator="teacherSEQ"
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ")
//"teacherSEQ"为@SequenceGenerator的标识名
//"teacherSEQ_DB"为指定到数据库生成的Sequence名
@SequenceGenerator(name="teacherSEQ",sequenceName="teacherSEQ_DB")
publicintgetId(){
returnid;
}
e)TABLE(可以忘记)
i.@TableGenerator
@TableGenerator(
name="teacherID",//被调用的TABLE名字
table="teacherID_DB",//数据库建立的表名
pkColumnName="key_value",
pkColumnValue="pk_value",
valueColumnName="teacher",//pkColumnValue对应类名
allocationSize=1//pkColumnValue对应类名
)
@GeneratedValue(strategy=GenerationType.TABLE,generator="teacherID")
注:
如果使用注解方式的uuid如下:
@Id
@GeneratedValue(generator="teacherUUID")
@GenericGenerator(name="teacherUUID",strategy="uuid")
1.通过注解方式生成一个generator(放在类名称上面)
@GenericGenerator(name="idGenerator",strategy="uuid")
2.主键生成器
@GeneratedValue(generator="idGenerator")
5FAQ;
a)用Junit测试时HibernateSessionFactory初始化异常不提示.疑似一个bug
b)用main来做测试
6联合主键
a)Xml方式:
composite-id
i.将联合主键的属性提取出来,重新编写一个pojo类(原pojo类中的id,name要删除并新加入属性“StudentPK”)
publicclassStudentPKimplementsSerializable{
privateStringid;
privateStringname;
……
ii.新建pojo类必须实现java.io.Serializable序列化接口
iii.新pojo类要重写equals和hashCode方法
@Override
publicbooleanequals(Objecto){
if(oinstanceofStudentPk){
StudentPkpk=(StudentPk)o;
if(this.id==pk.getId()&&this.name.equals(pk.getName())){
returntrue;
}
}
returnfalse;
}
@Override
publicinthashCode(){
returnthis.name.hashCod