【hibernate框架】几种集合映射

1.Set
前面我们已经用过,就不再说。

2.List
Group.java:

package cn.edu.hpu.listMapping;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="m_group")
public class Group {
	private int id;
	private String name;
	private List<User> users=new ArrayList<User>();

	@OneToMany(mappedBy="group",
			cascade={CascadeType.ALL},
			fetch=FetchType.LAZY
		)
	public List<User> getUsers() {
		return users;
	}
	public void setUsers(List<User> users) {
		this.users = users;
	}
	@Id
	@GeneratedValue
	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;
	}

}

User.java:

package cn.edu.hpu.listMapping;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="m_user")
public class User {
	private int id;
	private String name;
	private Group group;

	//只要有双向就要指定制定一个属性(mapedby)
	//不指定的话会有两个相同的字段产生
    @ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER)
	public Group getGroup() {
		return group;
	}
	public void setGroup(Group group) {
		this.group = group;
	}
	@Id
	@GeneratedValue
	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;
	}

}

在hibernate.cfg.xml中配置:

<mapping class="cn.edu.hpu.listMapping.Group"/>
<mapping class="cn.edu.hpu.listMapping.User"/>

执行测试,输出的sql语句:
alter table m_user 
        drop 
        foreign key FKBF71E05DA3D1B4E0

    drop table if exists m_group

    drop table if exists m_user

    create table m_group (
        id integer not null auto_increment,
        name varchar(255),
        primary key (id)
    )

    create table m_user (
        id integer not null auto_increment,
        name varchar(255),
        group_id integer,
        primary key (id)
    )

    alter table m_user 
        add index FKBF71E05DA3D1B4E0 (group_id), 
        add constraint FKBF71E05DA3D1B4E0 
        foreign key (group_id) 
        references m_group (id)

成功创建m_user与m_group表,并且在user里建立了group的外键关联关系。
这时候,我们在group中取user数据的时候,要用list来取。

原则上来说,用set和list的区别不大,但是,当我们对取出的数据进行排序的时候,用list比较方便(set不支持排序)。

排序可以设定任意属性进行排序,也可以使用联合属性进行排序。
这里我们可以通过设定Annotation注解来设定:

@OrderBy
public List<User> getUsers() {
		return users;
	}
//@OrderBy默认按主键id排序
//@OrderBy("X DESC")/@OrderBy("X ASC")指按照X属性的ASC(升序)或DESC(降序)排序

其实完全可以不这么做,因为HQL语句就可以实现从数据库取数据的时候进行orderBy排序了。

3.Map

User.java一样,Group中的users变成Map形式。Map的Key值设置为主键(因为Key值不能重复),value设为User。

package cn.edu.hpu.listMapping;

import java.util.HashMap;
import java.util.Map;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MapKey;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;

@Entity
@Table(name="m_group")
public class Group {
	private int id;
	private String name;
        private Map<Integer,User> users=new HashMap<Integer,User>();

        @OneToMany(mappedBy="group")
	@MapKey
	public Map<Integer, User> getUsers() {
		return users;
	}
	public void setUsers(Map<Integer, User> users) {
		this.users = users;
	}
	@Id
	@GeneratedValue
	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;
	}

}

其中@MapKey(name="id")指定map的Key值是属性的哪一个值。

建表语句:
 alter table m_user 
        drop 
        foreign key FKBF71E05DA3D1B4E0

    drop table if exists m_group

    drop table if exists m_user

    create table m_group (
        id integer not null auto_increment,
        name varchar(255),
        primary key (id)
    )

    create table m_user (
        id integer not null auto_increment,
        name varchar(255),
        group_id integer,
        primary key (id)
    )

    alter table m_user 
        add index FKBF71E05DA3D1B4E0 (group_id), 
        add constraint FKBF71E05DA3D1B4E0 
        foreign key (group_id) 
        references m_group (id)

这样,当我们取users的时候,它会帮我们装到map里。

取出测试(group-g1里面有u1、u2、u3三个user对象):

@Test
public void testMapGroup(){
	sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();
	Session s=sessionFactory.openSession();
	s.beginTransaction();
	Group g=(Group)s.load(Group.class,1);
	for(Map.Entry<Integer, User> entry:g.getUsers().entrySet()){
		System.out.println(entry.getValue().getName());
	}
	s.getTransaction().commit();
}

输出SQL语句和结果:
Hibernate: 
    select
        group0_.id as id0_0_,
        group0_.name as name0_0_ 
    from
        m_group group0_ 
    where
        group0_.id=?
Hibernate: 
    select
        users0_.group_id as group3_0_1_,
        users0_.id as id1_,
        users0_.id as formula0_1_,
        users0_.id as id1_0_,
        users0_.group_id as group3_1_0_,
        users0_.name as name1_0_ 
    from
        m_user users0_ 
    where
        users0_.group_id=?
u1
u2

u3

尊重开源精神,尊重劳动成果,转载请注明出处: http://blog.csdn.net/acmman/article/details/43907125

时间: 2024-10-29 02:41:57

【hibernate框架】几种集合映射的相关文章

详解Java的Hibernate框架中的set映射集与SortedSet映射_java

Set集合Set是一个java集合不包含任何重复的元素.更正式地说,Set不包含任何元素对e1和e2,使得e1.equals(e2),和至多一个空元素.所以被添加到一组对象必须实现equals()和hashCode()方法,使Java可以判断任何两个元素/对象是否是相同的. 集被映射到与映射表中<set>元素,并在java.util.HashSet中初始化.可以使用Set集合在类时,有一个集合中不需要重复的元素. 定义RDBMS表: 考虑一个情况下,我们需要我们的员工记录存储在EMPLOYEE

Java的Hibernate框架中的基本映射用法讲解_java

Hibernate进行了分类整合发现其实Hibernate分为三大部分:核心对象.映射.HQL,这三大部分开发过程中最常使用,前几篇讨论了核心对象及对象之间的转换方法,接下来讨论Hibernate的映射使用方法.   Hibernate一个重要的功能就是映射,它能够在对象模型和关系模型之间转换,是面向对象编程思想提倡使用的,使用映射程序开发人员只需要关心对象模型中代码的编写.对象和关系数据库之间的映射通常是由XML文档来定义的.这个映射文档被设计为易读的,并且可以手动修改.这种映射关系我总结为下

Java的Hibernate框架中的继承映射学习教程_java

一.继承映射继承是面向对象很重要的特性,它实现了代码的服用,在关系模型中同样也有继承关系,这种继承关系其实可以看做是一种枚举关系,一种类型中可以枚举出很多子类型,这些子类型和父对象形成了继承关系,能够对其进行枚举的大部分都可以看做是一种继承映射,所以这种枚举关系可以看做是继承映射,例如动物就是一种抽象类,它是其它动物猪.猫等的父类,它们之间就是一种继承关系,如下图: 这种继承映射在转化为关系模型后会生成一张表,那么这张表是如何区分这两种类型的呢?用的是关系字段,需要在表中添加类型字段,使用关键字

Java的Hibernate框架中的组合映射学习教程_java

一.组合映射组合是关联关系的一种特殊情况,是关联关系耦合度最高的一种关系,组合的主对象和子对象拥有相同的生命周期,主对像消亡的话子对象也会消亡.这里使用雇主和用户作为示例,用户和雇主都拥有联系方式属性,如果这里站在对象角度思考的话,常常会把对象模型绘制成为组合的方式,抽象出来一个共同的联系方式类,然后两种人分别包含相应的联系方式对象即可,向应的对象模型时它的对象示例如下图所示: 组合对象模型在生成相应的关系模型后会把对应的子类包含到主表中,所以对应的表结构会将相应的属性生成到对应的表中,相应的表

【HIBERNATE框架开发之七】HIBERNATE使用ANNOTATION中各种关系映射的CRUD(增删改查)&amp;&amp;集合映射&amp;&amp;继承映射

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/hibernate/822.html       首先对于Annotation中CRUD的C(Create)操作:-------- 假设 :   User (MonyToOne)       Group OK,那么有如下 Junit Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Conf

Hibernate框架学习之三:深入映射文件的配置

前言 这里主要是对XML版的Hibernate框架的开发进行说明,Annotation版会在另外的文章中在说明.由于Hibernate是一个全方位的ORM框架,那么要实现从Object到Record的完全过渡,实现的桥梁就是这里要讲的映射文件了.映射文件的内容繁多,主要是以开发中会使用到的为主进行说明.大体说来,映射文件主要是对class的映射,还包括属性,属性有分为主键.普通属性与集合属性,甚至还有复合类型等.每种属性都需要进行不同的配置,官方文档看得有点累,所以这里一并做一个总结. 映射文件

Hibernate之集合映射的使用(Set集合映射,list集合映射,Map集合映射)

a:数据库的相关知识: (1):一个表能否有多个主键:不能: (2):为什么要设置主键:数据库存储的数据都是有效的,必须保持唯一性: (3)为什么id作为主键:因为表中通常找不到合适的列作为唯一列,即主键,所有为了方便用id列,因为id是数据库系统维护可以保证唯一,所以就把这列作为主键,简单的说为了方便:如果找不到合适的列,除了使用id列以为作为主键,也可以使用联合主键,即多列的值作为一个主键,从而确保了记录的唯一性,即为联合主键: Hibernate的映射很重要哦,如果是一般的映射,很容易掌握

Java的Hibernate框架中集合类数据结构的映射编写教程_java

一.集合映射 1.集合小介集合映射也是基本的映射,但在开发过程中不会经常用到,所以不需要深刻了解,只需要理解基本的使用方法即可,等在开发过程中遇到了这种问题时能够查询到解决方法就可以了.对应集合映射它其实是指将java中的集合映射到对应的表中,是一种集合对象的映射,在java中有四种类型的集合,分别是Set.Map.List还有普通的数组,它们之间有很大的区别: (1)Set,不可以有重复的对象,对象是无序的: (2)List,可以与重复的对象,对象之间有顺序: (3)Map,它是键值成对出现的

详解Java的Hibernate框架中的List映射表与Bag映射_java

List映射表List列表是一个java集合存储在序列中的元素,并允许重复的元素.此接口的用户可以精确地控制,其中列表中的每个元素插入.用户可以通过他们的整数索引访问元素,并搜索列表中的元素.更正式地说,列表通常允许对元素e1和e2,使得e1.equals(e2),它们通常允许多个null元素,如果他们允许的null元素. List列表被映射在该映射表中的<list>元素,并将java.util.ArrayList中初始化. 定义RDBMS表: 考虑一个情况,需要员工记录存储在EMPLOYEE