`
wlzjdm
  • 浏览: 26045 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate中的集合类标签

 
阅读更多

 

List是一个有序集合,所以当其生成简单表的时候,需要指定其下标(通过list-index标签),并且需要指定其表的名字。List所对应的表中以一个外键和下标作为联合主键。

一个简单的例子,list中存储的是简单的数据类型:

建立表的时候用的SQL语句:

//移除外键关系,防止删除的时候禁止删除

alter table children drop foreign key FK62EA5DFF7EA87F47

//如果存在parentchildren表,则删除

drop table if exists children

drop table if exists parent

//新建一个children

create table children (id integer not null, name varchar(255), num integer not null, primary key (id, num))

//新建一个parent

create table parent (id integer not null, age integer, name varchar(255), primary key (id))

//list表添加一个一个索引序列,并且增加了一个外键约束

alter table children add index FK62EA5DFF7EA87F47 (id), add constraint FK62EA5DFF7EA87F47 foreign key (id) references parent (id)

<!-- 该类中的list作为一个表存储的,需要指定其表的名字 -->

<list name="children" table="children">

       <!-- id指的是children中的外键,也就是标识该记录属于哪一个 -->

       <key column="id"/>

       <!-- 这个是有序表的下标,从另一个角度而言,也可以唯一的确定某一个元素 -->      

       <list-index column="num"/>

       <!-- 表中的元素,有且只有一个元素 -->

       <element type="string" column="name"/>

</list>

一个简单的插入测试

Hibernate: select max(id) from parent

Hibernate: insert into parent (age, name, id) values (?, ?, ?)

Hibernate: insert into children (id, num, name) values (?, ?, ?)

Hibernate: insert into children (id, num, name) values (?, ?, ?)

Hibernate: insert into children (id, num, name) values (?, ?, ?)

 

Set

list的差别就在于set是一个无序的集合,所以它不需要存储下标,即需不要list-index标签。一般而言自动生成的表是不带主键的,但是如果element元素设置为not-null则会将set中的元素和外键联合作为主键(但是,一般而言没有这个必要的,因为当数据量很大的时候,主键并不能起多大作用)。

建表SQL语句和list一样:

alter table children drop foreign key FK62EA5DFFFA0F22FC

drop table if exists children

drop table if exists parent

create table children (parent_id integer not null, name varchar(255))

create table parent (id integer not null, age integer, name varchar(255), primary key (id))

alter table children add index FK62EA5DFFFA0F22FC (parent_id), add constraint FK62EA5DFFFA0F22FC foreign key (parent_id) references parent (id)

<set name="children" table="children">

       <!-- 集合属性的外键列 -->

       <key column="parent_id"/>

       <!-- 集合属性中的元素 -->

       <element type="string" column="name"/>

</set>

插入测试:

Hibernate: select max(id) from parent

Hibernate: insert into parent (age, name, id) values (?, ?, ?)

Hibernate: insert into children (parent_id, name) values (?, ?)

Hibernate: insert into children (parent_id, name) values (?, ?)

Hibernate: insert into children (parent_id, name) values (?, ?)

Bag

Bag元素可以为所有实现Collection接口的类进行属性映射,并且将其映射为无序集合,并且集合对应的表没有主键。其形式和set及其类似。

建表语句和listset一样:

alter table children drop foreign key FK62EA5DFFA72135C8

drop table if exists children

drop table if exists parent

create table children (person_num integer not null, name varchar(255))

create table parent (id integer not null, age integer, name varchar(255), primary key (id))

alter table children add index FK62EA5DFFA72135C8 (person_num), add constraint FK62EA5DFFA72135C8 foreign key (person_num) references parent (id)

<bag name="children">

       <key column="person_num"/>

       <element type="string" column="name"/>

</bag>

插入测试:

Hibernate: select max(id) from parent

Hibernate: insert into parent (age, name, id) values (?, ?, ?)

Hibernate: insert into children (person_num, name) values (?, ?)

Hibernate: insert into children (person_num, name) values (?, ?)

Hibernate: insert into children (person_num, name) values (?, ?)

Map

Map对应于java中的map接口,那么它存储的内容无意就是键-值信息了,外加一个外键。显然,它是将mapkey和外键联合起来作为主键的。

生成的建表语句:

alter table children drop foreign key FK62EA5DFF9987B23F

drop table if exists children

drop table if exists parent

create table children (parent_map_id integer not null, sex varchar(255), name varchar(255) not null, primary key (parent_map_id, name))

create table parent (id integer not null, age integer, name varchar(255), primary key (id))

alter table children add index FK62EA5DFF9987B23F (parent_map_id), add constraint FK62EA5DFF9987B23F foreign key (parent_map_id) references parent (id)

<map name="children">

       <!-- 映射外键 -->

       <key column="parent_map_id"/>

       <!-- mapkey -->

       <map-key type="string" column="name"/>

       <!-- mapvalue -->

       <element type="string" column="sex"/>

</map>

插入测试:

Hibernate: select max(id) from parent

Hibernate: insert into parent (age, name, id) values (?, ?, ?)

Hibernate: insert into children (parent_map_id, name, sex) values (?, ?, ?)

Hibernate: insert into children (parent_map_id, name, sex) values (?, ?, ?)

Hibernate: insert into children (parent_map_id, name, sex) values (?, ?, ?)

总结:

集合名字

标签名

备注

List

<list>

需要指定下标标签,其主键为:外键和下标联合形成

Set

<set>

如果<element>元素的not-null属性设置为true,则将外键和element内容联合设置为主键,否则没有主键

Collection

<bag>

没有主键

Map

<map>

其中map-keynot-null属性默认值为true,其主键为map的键值和外键联合组成的

性能对比总结:

当集合中元素内容很多很多的时候(例如十万),在初始化持久化类的时候,要完成所有集合属性的加载,势必将导致性能急剧下降。所以就产生了延迟加载策略:lazy=”true”

无序、有序集合的优缺点:

有序集合由<key><index>组成的联合主键,在这种情况下,集合属性的更新是非常高效的(主键已经被有效的索引)。

无序集合中,如果<element>元素设置为非空,那么也会有主键,但是如果此时<element>元素是组合元素或者为大量文本、二进制字段,那么数据库的主键就显得那么的庞大,使得检索性能变得很差。

 

=====================================

复杂类型的映射:

当一个模型中有一些属性为复杂类型的时候(例如是一个类的实例),需要用到<component>标签。此标签只是将一个表中某些耦合度很强的内容写在另一个类中,但是表现到数据库中仍和其他属性在一个表中。

其建表语句为:

drop table if exists parent

create table parent (id integer not null, age integer, name varchar(255), first varchar(255), last varchar(255), primary key (id))

<!-- 特别的,此处需要指定class属性,unique属性不是强制性的设置为ture,二十根据实际情况设定 -->

<component name="component" class="com.dong.model.Name" unique="true">

       <!-- 罗列出Name中的所有变量,并将其映射到数据库中的属性列 -->

       <property name="firstName" column="first"/>

       <property name="lastName" column="last"/>

</component>

那么如果集合中的属性为复杂属性的时候,需要做怎样的配置呢,其实也很简单的,只是将配置文件进行修改即可:

<set name="children" table="children">

       <!-- 集合属性的外键列 -->

       <key column="parent_id"/>

       <!-- 集合属性中的元素 -->

       <composite-element class=”com.dong.model.Name”>

              <!—映射每一个属性 -->

              <property name=”firstName”/>

              <property name=”lastName”/>

       <composite-element>

</set>

那么如果一个模型的主键为一个复杂属性的时候,又需要做如何的配置呢,也很简单,只需要用<composite-id>代替<id>即可。但是需要注意的是,作为主键的复杂属性所对应的类必须要重写equals()hashCode()方法,并且要实现serializable接口,其实这个原因也很容易想得到:重写那两个方法,只是为了确定主键的唯一性,实现比较对比;实现serializable接口是为了方便其存储到文件中,并且当从数据库中按照主键读取内容是,需要传递该类的一个实例(必须给主键赋值),也就是get的第二个实现serializable的参数。

下面是他的配置:

<class name=”com.dong.model.Person” table=”person”>

       <!—此标签的功能就相当于id标签的功能 -->

       <composite-id name=”name” class=”com.dong.model.Name”>

              <!—Name类中的所有变量映射到表中的属性列 -->

              <key-property name=”firstName”/>

              <key-property name=”firstName”/>

       </composite-id>

</class>

注意:hibernate是不推荐使用此方法的,因为主键越复杂,那么使得表的检索变得越困难,而且此处是使用的是联合主键使得检索变得更加的困难。

当然,如果模型的主键为一个复杂属性的时候,也可以将其复杂属性写在模型类中,没有必要新建一个类存储,但是也需要重写equals()hashCode()方法,并且仍然需要实现serializable接口,但是在equals方法和hashCode方法中只需要操作、判断将要作为主键的变量即可,无需考虑其它的变量,原因也显然而知,主键就是用来决定表的唯一性。

其配置文件和上面的那个及其相似,但是不需要为<composite-id>标签指定nameclass属性:

<class name=”com.dong.model.Person” table=”person”>

       <!—此标签的功能就相当于id标签的功能 -->

       <composite-id>

              <!—Name类中的所有变量映射到表中的属性列 -->

              <key-property name=”firstName”/>

              <key-property name=”firstName”/>

       </composite-id>

</class>

 

分享到:
评论

相关推荐

    Hibernate中文API大全

    你可以使用标签替代标签来定义你的组件集合。 ; &lt;composite-element class="eg.Name"&gt; &lt;!-- class attribute required --&gt; ; 注意,如果你定义的Set包含组合元素(composite-element),正确地...

    hibernate学习笔记

    集合(collection)映像 (hibernate_collection) 28 Hibernate 对数据库的并发支持 30 悲观锁(hibernate_pessimistic) 30 乐观锁(hibernate_optimistic) 32 HQL查询(hibernate_hql) 34 补充:SQL join连接 40 ...

    低清版 大型门户网站是这样炼成的.pdf

    4.3.12 hibernate的集合映射 266 4.4 小结 270 第5章 hibernate 3持久化技术实践与性能优化 271 5.1 操作持久化对象的常用方法介绍 271 5.1.1 使用session的begintransaction()方法 272 5.1.2 使用session的...

    (超赞)JAVA精华之--深入JAVA API

    1.1.2 集合类 1.1.2.1.1 日期类Date 1.1.2.1.2 日历类Calendar 1.1.2.1.3 随机数类Random 1.1.2.1.4 向量类Vector 1.1.2.1.5 栈类Stack 1.1.2.1.6 哈希表类Hashtable 1.1.2.1.7 位集合类BitSet Hashtable类 ...

    JAVA SE学习精华集锦

    1.1.2 集合类 8 1.1.2.1.1 日期类Date 9 1.1.2.1.2 日历类Calendar 10 1.1.2.1.3 随机数类Random 11 1.1.2.1.4 向量类Vector 12 1.1.2.1.5 栈类Stack 13 1.1.2.1.6 哈希表类Hashtable 14 1.1.2.1.7 位集合类BitSet ...

    Java数据模型框架BabyFish.zip

    BabyFish 是专为数据模型类准备的 Java 框架,是增强类型的 ...(3) 增强JPA/Hibernate,提供许强大的新功能,顺带地,将ADO.NET Entity Framework中的一些优秀能力借鉴并吸收到Hibernate中 标签:BabyFish

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    1.3. Seam 中的可点击列表:消息示例............................................................................................................................. 27 1.3.1. 理解代码.........................

    从J2SE到J2EE知识点介绍

    3.最终类和抽象类 18 (五).类的多态性 18 1. 方法的重载 18 2. 方法的覆盖 18 (六).接口 20 1. 定义接口 20 2. 实现接口 21 3. 内部类 23 (七).集合 30 1.Map集合 30 2. ArrayList集合 32 3. LinkedList集合 ...

    java8集合源码分析-SEWM:缝纫机

    配置sessionfactory使用packagesToScan属性自动扫描entity,不必在hibernate中配置实体类 移植到JPA使用Hibernate 5.2.8作为provider 由从JPA传回来Hibernate,简直是噩梦! 脱管状态对象不能直接删除,必须merge()...

    java开发常用jar包

    Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大 commons-lang.jar Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。 commons-...

    Struts2 in action中文版

    3.3.2 ActionSupport类 45 3.4 向对象传递数据 51 3.4.1 对象支持的JavaBean属性 52 3.4.2 ModelDriven动作 54 3.4.3 域对象用作数据转移的潜在危险 55 3.5 案例研究:文件上传 56 3.5.1 通过struts-default包获得内...

    java面试题

    25. 集合类都有哪些?主要方法? 14 26. 简述逻辑操作(&,|,^)与条件操作(&&,||)的区别。 14 27. XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 14 28. JSP和Servlet有哪些相同点和不同点...

    Java语言基础下载

    集合类的使用 136 实例分析 136 内容总结 153 独立实践 154 第十章:JAVA GUI概述 155 学习目标 155 GUI概述及组成 156 Swing优点 157 布局管理器 158 BorderLayout 159 GridLayout 161 CardLayout 162 ...

    java面试宝典

    94、元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,casecade属性应该取什么值?(单选)(D) 22 95、以下哪些属于Session的方法?(A,B,C,D,F) 22 96、Hibernate工作原理及为什么要用? 22 97、...

    Spring-Reference_zh_CN(Spring中文参考手册)

    在应用服务器中使用Hibernate的注意点 12.3. JDO 12.3.1. 建立PersistenceManagerFactory 12.3.2. JdoTemplate和JdoDaoSupport 12.3.3. 基于原生的JDO API实现DAO 12.3.4. 事务管理 12.3.5. JdoDialect 12.4. ...

    jdbc基础和参考

    many-to-one:标签中对于cascade的取值delete,delete-orphan,all-delete-orphan(只用unique属性值不为true不能出现)慎用 cascade:级联属性 none:不做任何级联操作 save-update:对当前对象执行save,update, ...

Global site tag (gtag.js) - Google Analytics