Hibernate中的持久化类
1.编写规则
• 提供一个无参数 public访问控制符的构造器
• 提供一个标识属性,映射数据表主键字段
• 所有属性提供public访问控制符的 set get 方法(javaBean)
• 标识属性应尽量使用基本数据类型的包装类型
• 不要用final修饰实体 (将无法生成代理对象进行优化)
2.持久化对象的唯一标识 OID
l Java按地址区分同一个类的不同对象.
l 关系数据库用主键区分同一条记录
l Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系
结论: 对象的OID和数据库的表的主键对应。为保证OID的唯一性,应该让Hibernate来为OID赋值
3.区分自然主键和代理主键
l 主键需要具备: 不为空/不能重复/不能改变
自然主键: 在业务中,某个属性符合主键的三个要求.那么该属性可以作为主键列.
代理主键: 在业务中,不存符合以上3个条件的属性,那么就增加一个没有意义的列.作为主键.
4.基本数据类型和包装类
l 基本数据类型和包装类型对应hibernate的映射类型相同
l 基本类型无法表达null、数字类型的默认值为0。
l 包装类默认值是null。当对于默认值有业务意义的时候需要使用包装类。
Java数据类型 |
Hibernate数据类型 |
标准SQL数据类型 |
byte、java.lang.Byte |
byte |
TINYINT |
short、java.lang.Short |
short |
SMALLINT |
int、java.lang.Integer |
integer |
INGEGER |
long、java.lang.Long |
long |
BIGINT |
float、java.lang.Float |
float |
FLOAT |
double、java.lang.Double |
double |
DOUBLE |
java.math.BigDecimal |
big_decimal |
NUMERIC |
char、java.lang.Character |
character |
CHAR(1) |
boolean、java.lang.Boolean |
boolean |
BIT |
java.lang.String |
string |
VARCHAR |
boolean、java.lang.Boolean |
yes_no |
CHAR(1)('Y'或'N') |
boolean、java.lang.Boolean |
true_false |
CHAR(1)('Y'或'N') |
java.util.Date、java.sql.Date |
date |
DATE |
java.util.Date、java.sql.Time |
time |
TIME |
java.util.Date、java.sql.Timestamp |
timestamp |
TIMESTAMP |
java.util.Calendar |
calendar |
TIMESTAMP |
java.util.Calendar |
calendar_date |
DATE |
byte[] |
binary |
VARBINARY、BLOB |
java.lang.String |
text |
CLOB |
java.io.Serializable |
serializable |
VARBINARY、BLOB |
java.sql.Clob |
clob |
CLOB |
java.sql.Blob |
blob |
BLOB |
java.lang.Class |
class |
VARCHAR |
java.util.Locale |
locale |
VARCHAR |
java.util.TimeZone |
timezone |
VARCHAR |
java.util.Currency |
currency |
VARCHAR |
5.普通属性
<hibernate-mapping> package 用于配置PO类所在包 例如: package="com.itheima.d_hbm" <class> 配置 PO类 和 表 之间对应关系 name:PO类全限定类名 例如:name="com.itheima.d_hbm.Person" 如果配置 package,name的取值可以是简单类名 name="Person" table : 数据库对应的表名 dynamic-insert="false" 是否支持动态生成insert语句 dynamic-update="false" 是否支持动态生成update语句 如果设置true,hibernate底层将判断提供数据是否为null,如果为null,insert或update语句将没有此项。 普通字段 <property> name : PO类的属性 column : 表中的列名,默认name的值相同 type:表中列的类型。默认hibernate自己通过getter获得类型,一般情况不用设置 取值1: hibernate类型 string 字符串 integer 整形 取值2: java类型 (全限定类名) java.lang.String 字符串 取值3:数据库类型 varchar(长度) 字符串 int 整形 <property name="birthday"> <column name="birthday" sql-type="datetime"></column> </property> javabean 一般使用类型 java.util.Date jdbc规范提供3中 java类型 mysql类型 java.sql.Date date java.sql.time time java.sql.timestamp timestamp null datetime 以上三个类型都是java.util.Date子类 length : 列的长度。默认值:255 not-null : 是否为null unique : 是否唯一 access:设置映射使用PO类属性或字段 property : 使用PO类属性,必须提供setter、getter方法 field : 使用PO类字段,一般很少使用。 insert 生成insert语句时,是否使用当前字段。 update 生成update语句时,是否使用当前字段。 默认情况:hibernate生成insert或update语句,使用配置文件所有项 注意:配置文件如果使用关键字,列名必须使用重音符
6.主键
<id>配置主键 name:属性名称 access="" 设置使用属性还是字段 column="" 表的列名 length="" 长度 type="" 类型 <generator> class属性用于设置主键生成策略 1.increment 由hibernate自己维护自动增长 底层通过先查询max值,再+1策略 不建议使用,存在线程并发问题 2.identity hibernate底层采用数据库本身自动增长列 例如:mysql auto_increment 3.sequence hibernate底层采用数据库序列 例如:oracle 提供序列 4.hilo </generator> 5.native 根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个。【】 ##以上策略使用整形,long, short 或者 int 类型 6.uuid 采用字符串唯一值【】 ##以上策略 代理主键,有hibernate维护。 7.assigned 自然主键,由程序自己维护。【】