`

hibernate的集合属性

阅读更多

于hibernate中,集合属性在Hibernate的映射文件中绝对是个非常重要的内容,理解和熟练掌握常用的集合属性则显得更为重要.这里,阿堂根据自己的学习所得体合,参考有关文章的基础上,自己建表和亲自动手写了大部分代码,并且将测试结果以图示的效果放到博客上,供朋友们学习,希望能对朋友们有所帮助,阿堂更希望朋友们参与交流和讨论来共同提高!

    在hibernate的配置文件中,例如每个人的考试成绩,就是典型的Map结构,每门功课对应一门成绩。或者更简单的集合属性,某个企业的部门,一个企业通常对应多个部门等。集合属性是现实生活中非常普遍的属性关系。
    集合属性大致有两种:第一种是单纯的集合属性,例如像List,Set或数组等集合属性;还有一种就是Map结构的集合属性。每个属性都有对应的key映射.
集合属性的元素大致有如下几种:
list:用于映射List集合属性.
set:用于映射Set集合属性.
map:用于映射Map集合属性.
bag:用于映射无序集合
idbag:用于映射无序集合,但为集合增加逻辑次序..
    这里阿棠就主要以list,set,map三种用得较多的情况,举例说明(图示+代码)
一.list集合属性的应用

    list是有序集合,因此持久化类到数据库时必须增加一列来表示集合元素的次序。看下面的持久化类,该person类有个集合属性schools,该属性对应多个学校。集合属性只能以接口声明。例如在下面的代码中,schools的类型只能是List,不能是ArrayList,但该集合属性必须使用实现类完成初始化.

 

public class Person  implements java.io.Serializable {

    // Fields 
 
    
  private static final long serialVersionUID = -7919195903369450389L;
  private Integer id;
     private Integer age;
     private String name;
    
     //集合属性list:学校
     private List schools=new ArrayList();

    // Constructors

   
    public Person() {
    }
  
    // Property accessors

    public Integer getId() {
        return this.id;
    }
   
    public void setId(Integer id) {
        this.id = id;
    }


    public Integer getAge() {
        return this.age;
    }
   
    public void setAge(Integer age) {
        this.age = age;
    }


 public List getSchools() {
  return schools;
 }

 public void setSchools(List schools) {
  this.schools = schools;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }
}

 

该持久化类的标识属性和普通属性的映射与前面相同,不同的是增加了集合属性。对本例的List集合属性,应该使用list元素完成映射。list元素要求list-index的子元素来映射有序集合的次序列。集合属性的值不可能与持久化类存储在同一个表内,集合属性会存存放在另外的表中,因此,必须以外键关联.以key元素来映射该外键列。下面是该持久化尖的映射文件.     

 
   
实战hibernate中的list,set,map等集合属性… - zhang8mss - zhang8mss的博客
  
      

    有了pojo,也有了映射文件,该类可以完成持久化操作访问,用于完成持久化的主程序如下

 

public class PersonManager
{

    public static void main(String[] args)
 {
        PersonManager mgr = new PersonManager();

        mgr.createAndStorePerson();

        HibernateUtil.sessionFactory.close();
    }

 private void createAndStorePerson()
 {
  Session session = HibernateUtil.currentSession();
  Transaction tx = session.beginTransaction();

        Person yeeku = new Person();

  yeeku.setAge(29);
  yeeku.setName("aaa");
  List l = new ArrayList();
  l.add("小学");
  l.add("中学");
  yeeku.setSchools(l);

  session.save(yeeku);  tx.commit();
  HibernateUtil.closeSession();
 }

}

 

所建数据表及运行效果图示如下

 

use hibernate

create table person
(
   id int identity(1,1) primary key not null,
   name varchar(20) not null,
   age int not null,
)

create table school
(
   id int identity(1,1) primary key not null,
   personid int  constraint fk_person_school  foreign key(personid)  references person(id) not null,
   list_order int not null,
   school_name varchar(20) not null
)

 

 

实战hibernate中的list,set,map等集合属性… - zhang8mss - zhang8mss的博客

 

 程序运行结束后,数据库将生成两个表: 一个表用于保存持久化类Person的基本属性,别一个表school将用于保存集合属性schools

 

二.set集合属性

------------------------------------------------------------

public class Person  implements java.io.Serializable {

    // Fields 
 
    
  private static final long serialVersionUID = -7919195903369450389L;
  private Integer id;
     private Integer age;
     private String name;
    
     //集合属性list:学校
     private Set schools = new HashSet();

    // Constructors

   
    public Person() {
    }
  
    // Property accessors

    public Integer getId() {
        return this.id;
    }
   
    public void setId(Integer id) {
        this.id = id;
    }


    public Integer getAge() {
        return this.age;
    }
   
    public void setAge(Integer age) {
        this.age = age;
    }


 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public Set getSchools() {
  return schools;
 }

 public void setSchools(Set schools) {
  this.schools = schools;
 }
}

 

--------------------------------------------------------------- 

 

 

public class PersonManager
{

    public static void main(String[] args)
 {
        PersonManager mgr = new PersonManager();

        mgr.createAndStorePerson();

        HibernateUtil.sessionFactory.close();
    }

 private void createAndStorePerson()
 {
  Session session = HibernateUtil.currentSession();
  Transaction tx = session.beginTransaction();

        Person yeeku = new Person();

  yeeku.setAge(29);
  yeeku.setName("aaa");
  Set s = new HashSet();
  s.add("小学");
  s.add("中学");
  yeeku.setSchools(s);

  session.save(yeeku);
  
  


  tx.commit();
  HibernateUtil.closeSession();
 }

}

---------------------------------------------------------------------

Set集合属性的映射与List非常相似,但因为Set是无序、不可得复的集合。因此,set元素无须使用index元素来指定集合元素的次序.与list相同的是.Set集合属性同样需要外键列,用于持久化类的集合属性的关联。

Set集合属性声明时,只能使用Set接口,不能使用实现类.
将上面示例的List集合属性改为Set集合属性即可,程序就不再重复了
映射文件夹也与List集合属性的映射相似,区别在于set元素,无须增加index列来保存元素的次序。下面
是Set集合的属性的映射文件.

 

 

 

 实战hibernate中的list,set,map等集合属性… - zhang8mss - zhang8mss的博客

 

-------------------------------------------------------------------------

    上面的映射文件中,element元素用于映射集合属性里的每个元素,该元素有个not-null属性,该属性默认为false,即该列默认为空.
    对于List和Set两种集合属性,List集合的元素有顺序,而Set集合属性的元素没有顺序。当集合属性在另
外的表中存储时,List集合属性可以用关联持久化类的外键和集合次序作为联合主键。但Set集合没有次序列,则以关联持久化类的外键和元素列作为联合主键,前提是元素不能为空(element不能为空,该表才有联合主键,否则该表没有主键)

 

 

use hibernate

create table person
(
   id int identity(1,1) primary key not null,
   name varchar(20) not null,
   age int not null,
)


create table school
(
   id int identity(1,1) primary key not null,
   personid int  constraint fk_person_school  foreign key(personid)  references person(id) not null,
   school_name varchar(20) not null
)

 

 

 

 

实战hibernate中的list,set,map等集合属性… - zhang8mss - zhang8mss的博客

 

三.Map集合属性

    Map集合属性不仅需要映射属性value,还需要映射属性key。映射Map集合属性时,同样需要外键列,同时还必须指定Map的key列。显然,系统将以键列和key类作为联合主键。
与所有集合属性类似的是,集合属性的声明只能使用接口。
看下面的pojo类:

 

public class Person  implements java.io.Serializable {

    // Fields 
 
    
  private static final long serialVersionUID = -7919195903369450389L;
  private Integer id;
     private Integer age;
     private String name;
    
     //集合属性list:学校
     private Map scores=new HashMap();

    // Constructors

   
    public Person() {
    }
  
    // Property accessors

    public Integer getId() {
        return this.id;
    }
   
    public void setId(Integer id) {
        this.id = id;
    }


    public Integer getAge() {
        return this.age;
    }
   
    public void setAge(Integer age) {
        this.age = age;
    }


 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public Map getScores() {
  return scores;
 }

 public void setScores(Map scores) {
  this.scores = scores;
 }

}

 

-----------------------------------------------

  配置文件

    <class name="Person">

        <id name="id" column="personid">
            <generator class="identity"/>
        </id>

        <property name="name"/>
        <property name="age"/>

  <map name="scores" table="score">
   <key column="personid" not-null="true"/>
   <map-key column="xueke" type="string"/>
   <element column="fenshu" type="float"/>
  </map>
    </class> 

 

------------------------------------------------------------

public class PersonManager
{

    public static void main(String[] args)
 {
        PersonManager mgr = new PersonManager();

        mgr.createAndStorePerson();

        HibernateUtil.sessionFactory.close();
    }

 private void createAndStorePerson()
 {
  Session session = HibernateUtil.currentSession();
  Transaction tx = session.beginTransaction();

        Person yeeku = new Person();

  yeeku.setAge(29);
  yeeku.setName("aaa");
  Map m = new HashMap();
  m.put("语文" , new Float(56f));
  m.put("英文" , new Float(23f));
  yeeku.setScores(m);

  session.save(yeeku);

  tx.commit();
  HibernateUtil.closeSession();
 }
}

-----------------------------------------

use hibernate

create table person
(
   id int identity(1,1) primary key not null,
   name varchar(20) not null,
   age int not null,
)
create table score
(
   id int identity(1,1) primary key not null,
   personid int  constraint fk_person_school  foreign key(personid)  references person(id) not null,
   xueke varchar(20) not null,
   fenshu float not null
)

实战hibernate中的list,set,map等集合属性… - zhang8mss - zhang8mss的博客

 

 

   Map集合属性应使用ma元素需要key和map-key两个子元素。其中key子元素用于映射外键列,而map-key则用于映射Map集合的key.该持久化类的映射文件如下.

程序运行结束后,保存集合属性scores的表将以personid和xueke作为联合主键.
注意:map-key和element元素都必须确定type属性.

分享到:
评论

相关推荐

    Hibernate集合属性的延迟加载.doc

    在给定的文档中,我们看到一个例子,展示了如何在 Hibernate 中配置一个具有集合属性的实体类 `Person`,以及如何通过映射文件启用延迟加载。`Person` 类拥有一个 `Set&lt;Address&gt;` 类型的 `addresses` 属性,表示个人...

    Hibernate映射集合属性List

    在Java持久化框架Hibernate中,映射集合属性是常见的需求,特别是对于那些具有一对多、多对多关系的实体对象。这里的"List"是Java集合框架中的一个接口,用于存储一组有序的元素,而在Hibernate中,它常用来映射...

    Hibernate 对集合属性的操作.zip_hibernate

    本资料重点探讨的是Hibernate对集合属性的操作,这是在实际项目开发中常见的需求,例如处理一对多、多对一、多对多等关联关系。下面将详细介绍Hibernate对集合属性的管理和操作。 1. **集合类型**:在Hibernate中,...

    Hibernate集合映射与关联关系

    本主题将深入探讨Hibernate集合映射与关联关系,包括"student与Score的Map集合关系"、"student与class的多对一"以及"一对多映射"的概念。 首先,让我们理解一下Hibernate中的集合映射。在关系型数据库中,一个实体...

    Hibernate集合映射

    **标题:Hibernate集合映射** **正文:** Hibernate作为Java领域中最流行的ORM(对象关系映射)框架之一,它的核心功能之一就是实现Java对象与数据库表之间的映射。集合映射是Hibernate中一个非常关键的概念,它...

    hibernate集合的映射

    在Java的持久化框架Hibernate中,集合映射是将数据库中的表关系映射到对象的集合属性上,以便实现对象关系映射(ORM)。本文将深入探讨Hibernate中的四种主要集合映射类型:Set、List、Array和Map,以及它们在实际...

    hibernate map 集合映射

    在Java的持久化框架Hibernate中,集合映射是将数据库中的表关系映射到对象的集合属性上,以便更好地管理和操作数据。这篇文章将深入探讨Hibernate中的集合映射机制,包括其基本概念、类型以及如何在实际开发中进行...

    hibernate set 集合映射

    4. **集合属性映射**:在实体类中,集合属性需要使用`@OneToMany`或`@ManyToMany`注解进行声明,并通过`mappedBy`指定反向关联的属性。 ```java @Entity public class User { @OneToMany(mappedBy = "user") ...

    [原]Hibernate集合映射

    《Hibernate集合映射详解》 Hibernate作为Java领域中的一款强大持久化框架,其核心功能之一就是对象关系映射(ORM),使得开发者可以方便地在Java对象与数据库表之间进行交互。其中,集合映射是Hibernate中非常关键...

    hibernate bag 集合映射

    这里,`propertyName`是Java对象中的集合属性名,`inverse="true"`表示子表的维护由父表负责,`key column`是外键列名,`one-to-many`指定与bag关联的实体类。 2. **注解映射**:如果使用注解,映射将在Java实体类...

    hibernate list集合映射

    在Java的持久化框架Hibernate中,集合映射是将数据库中的表与Java对象的集合属性关联的过程。List集合映射是其中常见的一种方式,它允许我们将数据库中的一组相关记录映射到Java对象的List列表中。这种映射机制使得...

    hibernate集合映射inverse和cascade详解.txt

    在深入探讨Hibernate集合映射中的`inverse`与`cascade`属性之前,我们首先需要理解Hibernate框架的基本概念。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用程序提供了一种将对象模型与数据库...

    Hibernate_3.2属性文档介绍_中文

    它可以将实体类中的集合属性映射到数据库的多对多、一对多关系上,实现复杂的数据关联。例如,一个用户可能有多个订单,这种关系就可以通过集合映射来实现。 #### 4. **枚举类型映射** 枚举类型在许多场景下非常...

    hibernate 集合映射

    在实际开发中,我们常常会遇到Java对象中包含集合属性的情况,例如一个学生可能有多个课程,一个课程可能有多个学生。这种一对多或多对多的关系就需要通过集合映射来实现。本文将深入讲解Hibernate中的集合映射,...

    Hibernate 延迟加载剖析与代理模式应用

    在Hibernate中,当从数据库加载一个实体时,默认情况下其实体的集合属性会被配置成延迟加载。这意味着集合属性中的数据并非立即加载到内存中,而是在第一次访问这些集合属性时才触发加载动作。这样的设计可以避免...

    JAVA培训-HIBERNATE的集合映射.doc

    ### JAVA培训-HIBERNATE的集合映射 #### 概述 本文主要聚焦于Hibernate框架下的集合映射机制,特别是针对`Set`、`List`、`Array`、`Map`、`Bag`五种集合...希望本文能帮助读者更好地理解和应用Hibernate集合映射技术。

    springmvc+hibernate使用jar包集合

    在给出的文件名称列表中,"spring"可能指的是Spring框架的相关jar包,但具体还需查看压缩包内容以了解完整的依赖集合。 综上所述,Spring MVC和Hibernate的集成使用涉及到了Web应用开发的多个层面,包括控制层、...

Global site tag (gtag.js) - Google Analytics