Hibernate的小小映射
Hibernate的映射本人给分为两种,一个是简单属性的映射,一个相对复杂属性的映射,复杂属性指的是set list map等。
简单的映射:(只列举一些常见的属性和常用的配置方法)
Private String name;
Private int gender;
Private Date birthday;
Private byte[] photo;
Private String desc; //description 的简写
对应的hibernate的映射配置:
<property name="name" column="" insert="true" not-null="true" update="true" length="" ></property>
红色字体的可以选择配置:属性介绍:
column="" 代表生成的表中的name属性对应的列名,如果不指定,则默认与name属性相同
not-null="true" 不允许为空
length: 一般在设置字符串类型,或者binary,blob等类型时,设置其最大的长度。
<property name="gender" type="int" />
最简单的基本设置
<property name="birthday" type="date" />
Type 为生成表时,该字段的类型,而日期的类型有多种:年月日,时分秒,年月日时分秒,每个都有其对应的值
<property name="photo" type="binary" length="512000"/>
Length属性表示了上传的图片最大为512000字节
<property name="desc" column="`desc`"/>
Column属性设置的是列名,但是该列名与关键字冲突,所以为了避免这一问题,加了两个反引号(左上角波浪形)
这里介绍一下对应的映射类型:hibernate—java-DB(需要注意的是,DB每种都有细节上的不同,这里仅是适用于大多数)
内置的映射类型:
Hibernate |
java |
sql |
取值范围 |
int或integer |
int 或java.lang.Integer |
INTEGER |
4 |
long |
Long或java.lang.Long |
BIGINT |
8 |
short |
short Short |
SMALLINT |
2 |
byte |
byte Byte |
TINYINT |
1 |
float |
float Float |
FLOAT |
4 |
double |
double Double |
DOUBLE |
8 |
big_decimal |
java.math.BigDecinimal |
NUMERIC |
8位含2位小数部分 |
character |
char Character String |
CHAR(1) |
定长字符 |
string |
java.langString |
VARCHAR |
变长串 |
boolean |
boolean Boolean |
BIT |
布尔 |
yes_no |
boolean Boolean |
CHAR(1) |
布尔 |
true_false |
boolean Boolean |
CHAR(1) |
布尔 |
Java的时间类型:
Hibernate |
java |
sql |
取值范围 |
date |
util.Date sql.Date |
DATE |
YYYY-MM-DD |
time |
util.Date sql.Time |
TIME |
HH:MM:SS |
timestamp |
util.Date sql.timestamp |
TIMESTAMP |
YYYYMMDDHHMMSS |
calendar |
java.util.Calendar |
TIMESTAMP |
YYYYMMDDHHMMSS |
calendar_date |
java.util.Calendar |
DATE |
YYYY-MM-DD |
大对象类型:
Hibernate |
java |
sql |
binary |
byte[] |
VARBINARY(BLOB) |
text |
String |
CLOB |
serializable |
实现类 |
BARBINARY(BLOB) |
clob |
sql.Clob |
CLOB |
blob |
sql.Blob |
BLOB |
JDK自带的个别java类的映射类型
Hibernate |
java |
sql |
class |
java.lang.Class |
VARCHAR |
locale |
java.util.Locale |
VARCHAR |
timezone |
java.util.TimeZone |
VARCHAR |
currency |
java.util.Currency |
VARCHAR |
复杂对象的映射:(其实也没多复杂,就是set,list,map,object[]这些东西的映射)
这个会在用到的时候写
仔细想了想,还是和对象关系映射一起写吧,这样实用性也比较强
接上面的User继续谈:
一对多映射:
现在有一个实体Department部门:和User的关系是一对多(一个部门有多个员工),这里主要用的是set的映射。
private Long id;
private String name;
private String desc;
private Set<User> set;
这个时候在User实体中也要加一个属性就是:private Department department;
对应的配置文件:
<class name="Department" table="test_department" >
<set name="set" >
<key column="departmentId" ></key>--------在department
<one-to-many class="User" />
</set>
</class>
<class name="User" table="test_user" >
<many-to-one name="department" class="Department" column="departmentId"></many-to-one>
</class>
User表中一个外键列departmentId,
下面仔细描述一下这些属性之间的关系:
如果我们自己写这个一对多的对应关系的映射,那么我个人建议先从多的一方写起,在这里就是User,我们的建表规则一般就是默认的在多的一方建外键,这个时候,在User里面维护一个属性Department,其与department的对应关系是多对一,所以写<many-to-one> name属性就是我们维护的属性的名字,class就是其对应的类,最后一个column是最关键的,它标志着,在我们即将自动生成的User表中的外键列—这里是departmentId,而在department表中对应的实体映射(这里应该参照javabean)应该为set, 并且是一的一方,所以为<one-to-many>,但是<set>必须要添加一个<key>属性,key中有一个column属性,这个<key>可以什么都不指定,就<key />就可以,这样默认的就会引用刚才我们配置的外键列departmentId,如果指定并且和User的外键列一致,那么就会在User表中只有一个外键列departmentId(建议这么配置),如果<key column=?>这个属性配置的和User引用的外键列不一致,那么就会在user表中生成两个外键列。造成冗余。
多对多映射:用户-----岗位
我们再添加一个实体岗位:station
private long id;
private String name;
private Set<User> user;
并且这时我们要在User实体中添加一个新的属性:
private Set<Station> station;
首先我们已经分析出了用户与岗位是多对多的关系,那么我们最明白的就是这个时候为了表述清楚他们之间的关系,我们必须建立一个中间表。这个时候配置如下:
先配置User:
<set name="station" table="user_station">
<key column="userId"></key>
<many-to-many class="Station" column="stationId" ></many-to-many>
</set>
配置station:
<set name="user" table="user_station">
<key column="stationId"></key>
<many-to-many class="User" column="userId"></many-to-many>
</set>
还是依次介绍这些属性,name就不用说了吧就是写实体bean时候的那个属性名。Table是中间表的表名,这两个多对多关系的配置的该属性必须一致。<key column=?>这个属性名和在对应关系的<many-to-many 中column属性必须一致。这个就不像一对多那种随意的控制,因为这个column的值是要相互引用的,所以也必须保持一致,否则的话就会出现中间表里的列增多了。不是我们想要的结果。相对来说我们平日分析最麻烦的多对多的关系,现在倒是很好配置了。
(不支持图片。。本来想把映射这里用图片的。)
如有错误,请您批评与更正!!!