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个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值