hibernate学习笔记(一)属性映射和关联关系映射

 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的值是要相互引用的,所以也必须保持一致,否则的话就会出现中间表里的列增多了。不是我们想要的结果。相对来说我们平日分析最麻烦的多对多的关系,现在倒是很好配置了。

(不支持图片。。本来想把映射这里用图片的。)

如有错误,请您批评与更正!!!

上一篇:10: Celery


下一篇:JDK5新特性---注解学习笔记(一)