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

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

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

时间: 2024-09-08 11:47:14

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

hibernate学习笔记(三)

hibernate的一些杂记:1.sessionFactory的用法:SessionFactory是线程安全的,构造 SessionFactory 很消耗资源sessionFactory = new Configuration().configure().addClass(**).addClass(**).buildSessionFactory();Session session = sessionFactory.openSession();在这里addClass的好处是不需要在hibernat

Hibernate及JPA对象关系映射:关联关系映射策略

关联关系映射 关联关系映射,是映射关系中比较复杂的一种映射关系,总的说来有一对一.一对多和多对多几种 关系.细分起来他们又有单向和双向之分.下面我们逐一介绍一下. 单向 OneToOne 单向一对一是关联关系 映射中最简单的一种,简单地说就是可以从关联的一方去查询另一方,却不能反向查询.我们用下面的例子来举例说明,清 单 1 中的 Person 实体类和清单 2 中的 Address 类就是这种单向的一对一关系,我们可以查询一个 Person 的对应的 Address 的内容,但是我们却不能由一

我的hibernate学习笔记(之三)

 五.Hibernate 主键策略( 上面的步骤三的一部分)       <id><generator class="主键策略" /></id>       主键:在关系数据库中,主键用来标识记录并保证每条记录的唯一性( 一般可保证全数据库唯一) .必须满足以下条件:          1)不允许为空.          2)不允许主键值重复.          3)主键值不允许改变.      1.自然主键:以有业务含义的字段为主键,称为自然主键.

Hibernate学习笔记之基本配置详解

1.下载页面 http://in.relation.to/Bloggers/HibernateORM422FinalReleased 2.解压hibernate,将lib目录下面的required目录下所有的jar包拷贝到我们的应用中的类加载路径,如果是web应用,放在/WEB-INF/lib/ 下面 3.如果需要用到数据库源那么将c3p0也放在/WEB-INF/lib/ 下面 4.创建一个持久化的类.这个类的实例将会被hibernate映射到数据库中对应的实例:  代码如下 复制代码 pack

spring学习笔记(5)属性文件引入使用

外部文件引用 在配置数据库参数或邮箱服务器参数等静态资源时,相对于直接将信息写入Spring的.xml,.java等配置文件中,更好的做法是将配置信息分类独立地存放到外部属性文件中,然后在Spring配置文件中引入使用.这种做法的好处是: 1. 提高配置信息的资源的复用性,可以供多个应用共享,同时若资源数据发生变化时,我们可以直接修改属性文件,即可使更改对多个应用生效. 2. 应用部署人员不用在复杂的spring信息配置文件中到处查找信息的修改位置,减少出错的几率. 3. 如果这些信息分布在ja

LDD3学习笔记(18):内存映射和DMA

  1.介绍性材料 #include <linux/mm.h> #include <asm/page.h> 和内存管理相关的大部分函数和结构, 原型和定义在这些头文件. void *__va(unsigned long physaddr); unsigned long __pa(void *kaddr); 在内核逻辑地址和物理地址之间转换的宏定义. PAGE_SIZE PAGE_SHIFT  常量, 给出底层硬件的页的大小(字节)和一个页面号必须被移位来转变为一个物理地址的位 数.

CSS学习笔记Padding 属性中参数的定义与使用_经验交流

一直都对CSS中Padding 属性中参数个数的定义颇为困惑,例如: body { padding: 32px;} body { padding: 32px 24px; } body { padding: 32px 24px 18px; } body { padding: 32px 24px 18px 12px; } 今天baidu查看了CSS的标准文档,其中是这样规定的: 如果只提供一个,将用于全部的四条边: 如果提供两个,第一个用于上-下,第二个用于左-右: 如果提供三个,第一个用于上,第二

JQuery 学习笔记 element属性控制_jquery

复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv=&qu

SSH整合学习笔记之spring与hibernate简单整合.doc

SSH整合学习笔记 大致的学习了一下struts1.x struts2.x  spring2.5 hibernate3.6,觉得东西很多,好些东西都记不住,最后发现想记住的方法就是多练习.自己多写一下简单的工程也会把这些知识巩固,但是公司现在不用这个,所以只能记下笔记,不忙的时候再拿来看看,坚持的练习一下.我也是初学,所以只是记下一些基础的东西,如果写错了什么,请朋友多多指出. 个人对SSH的理解也不算深入,只是大概的学完一圈觉得spring很强大,有的人觉得spring很难学,但是我觉得str