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的值是要相互引用的,所以也必须保持一致,否则的话就会出现中间表里的列增多了。不是我们想要的结果。相对来说我们平日分析最麻烦的多对多的关系,现在倒是很好配置了。
(不支持图片。。本来想把映射这里用图片的。)
如有错误,请您批评与更正!!!