【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

相关文章
|
1月前
|
Java 数据库连接 API
解锁高效开发秘籍:深入探究 Hibernate 如何优雅处理一对多与多对多关系,让数据映射再无烦恼!
【9月更文挑战第3天】Hibernate 是 Java 领域中最流行的 ORM 框架之一,广泛用于处理实体对象与数据库表之间的映射。尤其在处理复杂关系如一对多和多对多时,Hibernate 提供了丰富的 API 和配置选项。本文通过具体代码示例,展示如何使用 `@OneToMany`、`@JoinColumn`、`@ManyToMany` 和 `@JoinTable` 等注解优雅地实现这些关系,帮助开发者保持代码简洁的同时确保数据一致性。
32 4
|
2月前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
38 1
|
2月前
|
Java 数据库连接 数据库
AI 时代风起云涌,Hibernate 实体映射引领数据库高效之路,最佳实践与陷阱全解析!
【8月更文挑战第31天】Hibernate 是一款强大的 Java 持久化框架,可将 Java 对象映射到关系数据库表中。本文通过代码示例详细介绍了 Hibernate 实体映射的最佳实践,包括合理使用关联映射(如 `@OneToMany` 和 `@ManyToOne`)以及正确处理继承关系(如单表继承)。此外,还探讨了常见陷阱,例如循环依赖可能导致的无限递归问题,并提供了使用 `@JsonIgnore` 等注解来避免此类问题的方法。通过遵循这些最佳实践,可以显著提升开发效率和数据库操作性能。
72 0
|
2月前
|
数据库 开发者 Java
Hibernate映射注解的魔力:实体类配置的革命,让你的代码量瞬间蒸发!
【8月更文挑战第31天】Hibernate 是一款出色的对象关系映射框架,简化了 Java 应用与数据库的交互。其映射注解让实体类配置变得直观简洁。本文深入剖析核心概念与使用技巧,通过示例展示如何简化配置。
28 0
|
2月前
|
数据库 Java 数据库连接
Struts 2 与 Hibernate 的完美邂逅:如何无缝集成两大框架,轻松玩转高效 CRUD 操作?
【8月更文挑战第31天】本文通过具体示例介绍了如何在 Struts 2 中整合 Hibernate,实现基本的 CRUD 操作。首先创建 Maven 项目并添加相关依赖,接着配置 Hibernate 并定义实体类及其映射文件。然后创建 DAO 接口及实现类处理数据库操作,再通过 Struts 2 的 Action 类处理用户请求。最后配置 `struts.xml` 文件并创建 JSP 页面展示用户列表及编辑表单。此示例展示了如何配置和使用这两个框架,使代码更加模块化和可维护。
46 0
|
2月前
|
Java 数据库连接 数据库
|
3月前
|
SQL Java 数据库连接
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
60 0
|
4月前
|
Java 数据库连接 数据库
探索JPA生态:Hibernate与其他ORM框架的对比分析
【6月更文挑战第25天】**JPA标准下的Hibernate是流行的ORM实现,提供丰富功能如二级缓存和延迟加载,但其学习曲线较陡,性能优化复杂。相比如MyBatis,Hibernate的JPQL更面向对象,MyBatis则接近SQL。选择ORM需考虑项目需求和个人偏好。**
70 0
|
4月前
|
Java 数据库连接
杨老师课堂之JavaEE三大框架Hibernate入门第一课
杨老师课堂之JavaEE三大框架Hibernate入门第一课
27 0
|
5月前
|
SQL 缓存 Java
Java一分钟之-Hibernate:ORM框架实践
【5月更文挑战第15天】Hibernate是Java的ORM框架,简化数据库操作。本文列举并解决了一些常见问题: 1. 配置SessionFactory,检查数据库连接和JDBC驱动。 2. 实体类需标记主键,属性映射应匹配数据库列。 3. 使用事务管理Session,记得关闭。 4. CRUD操作时注意对象状态和查询结果转换。 5. 使用正确HQL语法,防止SQL注入。 6. 根据需求配置缓存。 7. 懒加载需在事务内处理,避免`LazyInitializationException`。理解和避免这些问题能提升开发效率。
56 0