Hibernate映射配置(POJO的映射配置)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1)根元素映射

schema="schemaName"

catalog="catalogName"


default-cascade="cascade_style"


default-access="field|property|ClassName"


default-lazy="true|false"


auto-import="true|false"


package="">
...

其中,default-cascade,default-lazy和package是比较常用的属性。


需要了解的属性:
default-cascade="cascade_style"
default-lazy="true|false"
package=""

2)类映射

name="POJO类的完全限定名"


table="对应的库表名"


discriminator-value="discriminator_value"


mutable="true|false"


schema="owner"


catalog="catalog"


proxy="ProxyInterface"


dynamic-update="true | false"


dynamic-insert="true | false"


polymorphism="implicit | explicit"


where="查询时使用的SQL的条件子句"


persister="PersisterClass"

批量查询数据时的数量-->
batch-size="N"


optimistic-lock="none|version|dirty|all"


lazy="true|false"


entity-name="EntityName"


check="arbitrary sql check condition"


rowid="rowid"


subselect="SQL expression"


abstract="true|false"
node="element-name"
/>

其中,我们需要关注的是:name、table等这些属性


例子:
table="student"
discriminator-value="pojo.Student"
dynamic-insert="true"
select-before-update="true"
polymorphism="implicit"
where="age < 18"
lazy="true"
>
...



3)属性映射:
三种类型之间的映射:(标准SQL类型为MYSQL语句标准)
Hibernate映射类型 Java类型 标准SQL类型 大小
---------------------------------------------------------------------
integer/int ng.Integer/int INTEGER 4字节
long ng.Long/long BIGINT 8字节
short ng.Short/short SMALLINT 2字节
byte ng.Byte/byte TINYINT 1字节
float ng.Float/float FLOAT 4字节
double ng.Double/double DOUBLE 8字节
big_decimal java.math.BigDecimal NUMERIC
character ng.Character/ CHAR(1) 定长字符
ng.String/char
string ng.String VARCHAR 变长字符
boolean/ ng.Boolean BIT 布尔类型
yes_no/true_false /Boolea
date java.util.Date DATE 日期
/java.sql.Date
timestamp java.util.Date TIMESTAMP 日期
/java.util.Timestamp
calendar java.util.Calendar TIMESTAMP 日期
calendar_date java.util.Calendar DATE 日期
binary byte[] BLOB BLOB
text ng.String TEXT CLOB
serializable 实现 BLOB BLOB
java.io.Serializable接口
的任意Java类
clob java.sql.Clob CLOB CLOB
blob java.sql.Blob BLOB BLOB
class ng.Class VARCHAR 定长字符
locale java.util.Locale VARCHAR 定长字符
timezone java.util.TimeZone VARCHAR 定长字符
currency java.util.Currency VARCHAR 定长字符

4)主键的配置:
1.形式




2.主键


1)在RDB中,用来唯一标识数据记录的,
通常不能为空,
不可重复的,
而且是不能改变的。

2)实际应用中,分为2种主键:
自然主键
使用业务表中的字段(优:不需要定义额外的字段)
代理主键
额外添加一个无业务含义的字段(常命名为id)

各有优缺点,但Hibernate推荐使用代理主键

3)Hibernate是如何使用对象标识(ObjectID)来区分对象
即:obj1==obj2?
Hibernate查询记录是生成对象的过程(与一级缓存相关)
图示

4)
为了保证持久化对象OID的唯一性、不可变性。
一般的,都是由 Hibernate|Database 来给OID初始化值
同时,把OID的setter方法设置为私有方法,从而禁止其他程序修改。



5)主键生成策略
Hibernate支持多种主键生成策略,generator节点中class属性的值:
assigned:主键由程序生成(在save()前为对象分配一个ID),无需Hibernate或数据库参与。
这也是元素没有指定时的默认生成策略。
hilo:通过hi/lo(高/低位)算法生成主键,需要额外的数据库保存主键生成的历史状态。
hi/lo算法 产生的标识只在一个特定的DB中是唯一的。
seqhilo:通过hi/lo算法生成主键,但是主键生成的历史状态保存在Sequence中。
使用于Oracle等支持Sequence的数据库。
increment:主键按数值顺序递增。
作用类型:long,short,int
使用场景:在没有其他进程同时往同一张表插数据时使用,在cluster下不能使用
indentity:采用数据库提供的主键生成机制。
通常是对DB2,Mysql, MS Sql Server, Sybase, Hypersonic SQL(HSQL)内置的标识字段提供支持。
返回类型:long,short, int
sequence:采用数据库提供的Sequence机制。
对Oracle,DB2等数据库而言,它们都提供序列发生器生成主键,Hibernate也提供支持。
native:由Hibernate根据底层数据库自行判断采用indentity, hilo或sequence中的一种。
是最通用的实现。

UUID:
uuid.hex:由Hibernate基于128位唯一值产生算法生成十六进制数(长度为32的字符串---使用了IP地址)。
uuid.string:与uuid.hex一样,但是生成16位未编码的字符串,在PostgreSQL等数据库中会出错。
foreign:由其他表的某字段作为主键,通常与联合使用。
select:通过DB触发器(trigger)选择一些唯一主键的行,返回主键值来分配主键
sequence-identity:特别的序列发生策略,使用DB序列来生成值,但一般是和JDBC3的getGenneratedKeys结合在一起,使得在执行insert时就返回生成的值。
Oracle 10g(支持JDK1.4)驱动支持这一策略。


其中,native, assigned对应与自然主键策略,即主键不自动产生




例子:
使用hi/lo算法生成主键
步骤:
1)创建hi_value,表提供的字段next_value,并插入初始记录
insert hi_value(next_value) values(0);
2)构建表配置
3)在同一个事务中插入多条数据,观察其id值
-
配置:

hi_value
next_value
5

需要一个额外的表(hi_value)来保存high位的值
其中,max_lo是low位的值

hi/lo算法简介(了解):
id=hi*(max_lo + 1) + lo

特点:
独立于DBMS,不同的数据库对主键生成不会造成任何的影响
OID只能使用long,int,short及其包装类

3.复合主键策略
对于表需要2个或2个以上的字段才能唯一标识记录,这时候就需要使用复合自然主键

例子:书目管理(hbmbookmgr)
create table book(
publisher varchar(20),
bookname varchar(50),
version varchar(5),
author varchar(30),
primary key(bookname, version)
);

1)配置形式:









2)BookId是主键类,需要遵循如下约束:
实现Serializable接口
覆盖Object提供的equals、hasCode方法
属性必须含有主键的所有字段

相关文档
最新文档