`
java心如止水
  • 浏览: 32022 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Hibernate三种容器(List,Set,Map)映射技术之Set映射 和Hibernat的延迟

阅读更多

 环境: eclipse+myeclipse+mysql.

(1) 建表脚本

--删除表
drop table if exists person ;
drop table if exists email ;

--新建表
create table person
(
 id int AUTO_INCREMENT not null primary key ,
 name varchar(20)
) ;
create table email
(
 id int not null ,
 address varchar(50) not null ,
 foreign key (id) references person(id) on delete cascade
);

--提交
commit ;

(2) Person.java的编写.

package org.hibernate.listmapping.vo;

import java.util.HashSet;
import java.util.Set;

/**
 * Person generated by MyEclipse Persistence Tools
 */

public class Person implements java.io.Serializable {

 private int id ;
 private String name ;
 private Set email = new HashSet() ;
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public Set getEmail() {
  return email;
 }
 public void setEmail(Set email) {
  this.email = email;
 }
 

}

(3) Person.hbm.xml的编写.

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
 
 <class name="org.hibernate.listmapping.vo.Person" table="person">
  <id name="id" type="java.lang.Integer">
   <column name="id">
   </column>
   <generator class="native">
   </generator>
  </id>
  <property name="name" type="java.lang.String">
   <column name="name"></column>
  </property>
 
  <set name="email" table="email" lazy="false">
   <key column="id"></key>
   <element type="java.lang.String" >
    <column name="address"></column>
   </element>
  </set>
 
 </class>

</hibernate-mapping>


(4) hibernate.cfg.xml配置文件

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

<session-factory>
 <property name="connection.username">root</property>
 <property name="connection.url">
  jdbc:mysql://localhost:3306/hibernatetable
 </property>
 <property name="dialect">
  org.hibernate.dialect.MySQLDialect
 </property>
 <property name="myeclipse.connection.profile">mysql</property>
 <property name="connection.password">mysqladmin</property>
 <property name="connection.driver_class">
  com.mysql.jdbc.Driver
 </property>
 <property name="show_sql">true</property>
 <mapping resource="org/hibernate/listmapping/vo/Person.hbm.xml" />

</session-factory>

</hibernate-configuration>

(5)Insert测试类

package org.hibernate.listmapping.dao;

import org.hibernate.HibernateSessionFactory;
import org.hibernate.Session;
import org.hibernate.listmapping.vo.Person;

public class PersonDao {
 public void insert(Person p)
 {
  Session session = HibernateSessionFactory.getSession() ;
  session.save(p) ;
  session.beginTransaction().commit() ;
  session.close() ;
 }//end method insert
 
 public static void main(String[] args)
 {
  PersonDao pd = new PersonDao() ;
  Person p = new Person() ;
 
  //插入两个相同的email,在实际上数据库中只有一个,
  // set的特性.
  p.getEmail().add("123@163.com") ;
  p.getEmail().add("123@163.com") ;
 
  p.getEmail().add("124@163.com") ;
  p.getEmail().add("125@163.com") ;
 
  p.setName("zhangsan") ;
 
  pd.insert(p) ;
 }
}

(6)lazy  延迟加载.
 将此处的<set name="email" table="email" lazy="false">改成
  <set name="email" table="email" lazy="true">,就是Hibernate的延迟加载(懒加载机制了.

延迟加载测试类.

package org.hibernate.setDemo.dao;

import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.SimpleExpression;
import org.hibernate.setDemo.vo.Person;

public class PersonDao {
 
 private Session session  ;
 public PersonDao()
 {
  session = new Configuration().configure().buildSessionFactory()
    .openSession() ;
 }
 
 public void insert(Person p)
 {
  session.save(p) ;
  session.beginTransaction().commit() ;
  session.close() ;
 }
 
 public void update(Person p)
 {
  session.update(p) ;
  session.beginTransaction().commit() ;
  session.close() ;
 }
 
 public Person findById(int id)
 {
  Person p ;
  Criteria c = session.createCriteria(Person.class) ;
  SimpleExpression se = Expression.eq("id", id) ;
  c.add(se) ;
  List l =  c.list() ;
  if(l.size()>0)
  {
   p = (Person) l.get(0) ;
   return p ;
  }
  return null ;
 }
 
 public static void main(String []args)
 {
  PersonDao pd = new PersonDao() ;
  
  Person p = pd.findById(1) ;
  System.out.println(p.getName()) ;
  Set s = p.getEmail() ;
  Iterator i = s.iterator() ;
  while(i.hasNext())
  {
   String address = (String)i.next() ;
   System.out.println(address) ;
  }
  
 }
}

当我们的 Lazy = false时,运行上面的测试类控制台输出如下:
Hibernate: select this_.id as id0_0_, this_.name as name0_0_ from person this_ where this_.id=?
Hibernate: select email0_.id as id0_, email0_.address as address0_ from email email0_ where email0_.id=?
zhangsan
126@163.com
125@163.com
123@163.com
124@163.com
127@163.com
分析:我们可以看到,在查这个人的时候,附带的把这个人的地址都查出来放入内存中了.

当我们的 Lazy = true 时,运行上面的测试类控制台输出如下:
Hibernate: select this_.id as id0_0_, this_.name as name0_0_ from person this_ where this_.id=?
zhangsan
Hibernate: select email0_.id as id0_, email0_.address as address0_ from email email0_ where email0_.id=?
126@163.com
125@163.com
123@163.com
124@163.com
127@163.com
分析:我们可以很清楚的看到,是在我们要这个人的email地址的时候,才到数据库中去查,而不是事先去查.

 

分享到:
评论

相关推荐

    Hibernate容器映射技术(Set、List、Map)

    Hibernate容器映射技术(Set、List、Map)

    hibernate中容器映射技术

    下面将分别对Set、Map和List这三种容器映射技术进行详细讲解。 首先,我们来看Set容器映射技术。在Hibernate中,Set接口的实现类如HashSet和TreeSet通常用于一对多或多对多的关系映射。例如,一个用户可以有多个...

    Hibernate常见集合映射(Set,List_Array,Map,Bag)

    常见的集合映射类型有 Set、List、Array、Map 和 Bag 等,每种类型都有其特点和应用场景。 Set 集合映射 Set 集合是 Hibernate 中基础的集合类型,元素数据一般使用外键同主表关联。Set 集合非常适用于集合元素不...

    Hibernate_容器映射技术笔记

    本篇笔记主要探讨了如何使用Hibernate进行容器映射,特别是针对集合类型的映射,如List、Set和Map。 首先,我们来看集合类型在Hibernate中的映射: 1. **单值Collection**: 这种情况通常指的是一个对象与多个其他...

    hibernate map 集合映射

    Map映射 Map集合映射比较特殊,因为它的键和值都可以是任何对象。键通常映射到数据库的某个字段,而值则映射到另一个对象。以下是一个例子: ```xml &lt;!-- User.hbm.xml --&gt; &lt;map name="properties" table="USER_...

    hibernate set 集合映射

    在Java的持久化框架Hibernate中,集合映射是将数据库中的表关系映射到对象模型中的集合类,如List、Set、Map等。这允许我们在Java代码中操作对象集合,而Hibernate负责处理底层的SQL查询和数据存储。本文将深入探讨`...

    hibernate集合的映射

    本文将深入探讨Hibernate中的四种主要集合映射类型:Set、List、Array和Map,以及它们在实际开发中的应用场景和配置。 一、Set集合映射 Set集合映射是最常见的映射类型,它不允许重复元素。在Hibernate中,Set通常...

    hibernate 中的 set map list 代码

    在Hibernate中,我们通常使用`@ElementCollection`或`@ManyToMany`注解来映射Set。例如,如果一个User类可以有多个Phone对象,我们可以这样定义: ```java @Entity public class User { @Id private Long id; @...

    Hibernate中List信息的配置

    ### Hibernate中的List与Set映射 在Hibernate中,List和Set都是用来处理一对多(One-to-Many)或许多对多(Many-to-Many)关系的集合类型。尽管它们在Java中都是用于存储多个对象的集合,但在Hibernate中,二者的...

    JAVA数据类型与Hibernate的类型映射

    对于数组和集合,如List、Set、Map等,Hibernate提供了ListType、SetType、MapType等映射类型,可以根据实际需求选择。 此外,自定义对象的映射是Hibernate映射中的一个重要部分。通过在实体类上使用@Entity注解,...

    [原]Hibernate集合映射

    Hibernate支持多种集合映射类型,包括List、Set、Map、Bag、Array等。它们之间的区别主要在于元素的唯一性、顺序性和映射到数据库的实现方式。例如,List和Array维护元素的插入顺序,而Set不允许重复元素;Map则...

    Hibernate集合映射与关联关系

    在Hibernate中,我们可以使用集合类(如List、Set、Map等)来映射这些关系。例如,一个学生可以有多次成绩记录,这就构成了一个学生到成绩的映射关系,通常我们使用Map来表示这种关系,因为Map能确保每个学生都有...

    常用 Hibernate 映射配置说明.doc

    通过`set`、`list`、`map`等集合节点实现一对多的关联映射,其中`inverse`属性用于控制关联关系的维护方。 #### 7. 多对一关联 `many-to-one`节点表示多对一的关系,通常涉及外键引用。 #### 8. 多对多关联 `...

    hibernate的多种映射关系

    Hibernate 支持多种集合类型,如 List、Set、Map 等,它们可以作为一对多或多对多关系的容器。`@ElementCollection` 用于映射非实体类属性的集合,而 `@OrderColumn` 可以指定集合元素的排序方式。 6. **级联操作 ...

    Hibernate映射配置实例大全(详细总结)

    例如,`&lt;set&gt;`用于映射Java集合到数据库的表,`&lt;list&gt;`映射到有序的列表,`&lt;map&gt;`映射到键值对,`&lt;bag&gt;`则用于无序集合。每个集合映射都可以配置元素类型、排序规则以及关联的表。 在配置中,我们还需要关注懒加载...

    hibernate 集合映射

    Set集合不允许有重复元素,因此在Hibernate中,set映射通常用于表示唯一性关系,如一对多关系。在Hibernate映射文件中,我们可以使用`&lt;set&gt;`标签来配置。例如: ```xml &lt;set name="courses" table="COURSE" ...

    hibernate中的集合映射范例程序

    2. **Set映射**:Set不允许元素重复,且无特定顺序。在Hibernate中,我们通常使用`&lt;set&gt;`标签,它默认按对象的自然排序或自定义比较器排序。例如,一个部门可以有多个员工,员工ID可以作为唯一标识,因此适合用Set。...

    hibernate(基于MVC的服务器架构技术)

    - **容器映射**:包括List、Set、Map等容器类型的映射,如元素类型、索引类型、集合的关联关系等。 在实际开发中,掌握这些基本概念后,还需要了解实体的状态管理(瞬时、持久化、托管、脱管),以及Criteria、HQL...

    Hibernate映射解析 七种映射关系 后端 - Java.zip

    Hibernate支持多种集合类型,如List、Set、Map等,它们对应不同的数据库表结构。比如,`@ElementCollection`用于非关联的简单类型的集合,而`@OneToMany`和`@ManyToMany`则用于关联的实体类型的集合。 以上就是...

Global site tag (gtag.js) - Google Analytics