`

hibernate中List一对多映射关系详解

 
阅读更多

场景:一个Team对一个多个Student,其中Team中的studes属性为List类型

直接上代码,测试通过的:

Team.java

package com.fgh.hibernate;

import java.util.ArrayList;
import java.util.List;
/**
 * 一的一方
 * @author fgh
 *
 */
@SuppressWarnings("unchecked")
public class Team {

	private String id;

	private String name;

	private List students = new ArrayList();

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

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

	public List getStudents() {
		return students;
	}

	public void setStudents(List students) {
		this.students = students;
	}
}


Studeng.java

package com.fgh.hibernate;

/**
 * 多的一方
 * @author fgh
 *
 */
public class Student {

	private String id;

	private String cardId;

	private String name;

	private int age;

	private Team team;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getCardId() {
		return cardId;
	}

	public void setCardId(String cardId) {
		this.cardId = cardId;
	}

	public String getName() {
		return name;
	}

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

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Team getTeam() {
		return team;
	}

	public void setTeam(Team team) {
		this.team = team;
	}

}


以下三个配置文件均放在src根目录下:

hibernate主配置文件:

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.url">
			jdbc:mysql://localhost:3306/hibernate
		</property>
		<property name="connection.username">root</property>
		<property name="connection.password">root</property>
		<property name="connection.driver_class">
			com.mysql.jdbc.Driver
		</property>
		<property name="dialect">
			org.hibernate.dialect.MySQLDialect
		</property>

		<property name="show_sql">true</property>

		<!-- 引入两个相关配置文件 -->
		<mapping resource="Team.hbm.xml" />
		<mapping resource="Student.hbm.xml" />

	</session-factory>

</hibernate-configuration>

一方配置文件: Team.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="com.fgh.hibernate.Team" table="team_list">
		<!-- 采用uuid生成主键 这里要指定type为string类型 -->
		<id name="id" column="id" type="string">
			<generator class="uuid"></generator>
		</id>

		<!-- 像类似这样的name属性 都是指类里面的成员变量 column指数据库中对应的字段名-->
		<property name="name" column="name" type="string"></property>

		<!-- 设置级联为 cascade="all"-->
		<list name="students" table="student_list" cascade="all">
			<!-- 维护对方的外键 -->
			<key column="team_id"></key>
			<!-- index标签表示多的一方 对应一的一方的索引位置 
			    column属性表示数据库中存放数据的字段
				index为关键字 避免跟关键字冲突 使用`index` 或 [index]
			-->
			<index column="[index]" type="string"></index>
			<!-- 建立一对多的关联 -->
			<one-to-many class="com.fgh.hibernate.Student" />
		</list>
	</class>
</hibernate-mapping>

多方配置文件 : Studeng.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="com.fgh.hibernate.Student" table="student_list">

		<id name="id" column="id" type="string">
			<generator class="uuid"></generator>
		</id>

		<property name="cardId" column="card_id" type="string"></property>
		<property name="name" column="name" type="string"></property>
		<property name="age" column="age" type="int"></property>

		<!-- 因为list中的value 不是原始类型 所以要指定其类型 -->
		<!-- 建立多对一关联映射关系 column="team_id"表示team这张表通过该字段
			 和student表关联 -->
		<many-to-one name="team" column="team_id"
			class="com.fgh.hibernate.Team">
		</many-to-one>
	</class>
</hibernate-mapping>

根据以上三个配置文件,可以生成对应的数据库表,代码如下:

CreateTable.java

package com.fgh.hibernate;

import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

/**
 * 根据.hbm.xml配置文件创建相应的数据库表
 * @author fgh
 *
 */
public class CreateTable {
	public static void main(String[] args) {
		SchemaExport export = new SchemaExport(new Configuration().configure());
		// 第一个参数表示是否在控制台打印出DDL语句(print the DDL to the console)
		// 第二个参数表示是否将脚本输出到数据库(export the script to the database)
		export.create(true, true);
	}
}


运行CreateTable.java 生成对应表,后台打印sql如下:

alter table student_list drop foreign key FKFEDE142211CB0B6A
drop table if exists student_list
drop table if exists team_list
create table student_list (id varchar(255) not null, card_id varchar(255), name varchar(255), age integer, team_id varchar(255), `index` integer, primary key (id))
create table team_list (id varchar(255) not null, name varchar(255), primary key (id))
alter table student_list add index FKFEDE142211CB0B6A (team_id), add constraint FKFEDE142211CB0B6A foreign key (team_id) references team_list (id)


ok,表已经创建成功,下面测试保存操作:

InsertTest.java

package com.fgh.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

/**
 * 保存操作测试类
 * @author fgh
 *
 */
public class InsertTest {

	private static SessionFactory sessionFactory;

	//创建工厂实例
	static {
		try {
			sessionFactory = new Configuration().configure()
					.buildSessionFactory();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		Session session = sessionFactory.openSession();
		Transaction tx = null;

		try {
			//创建两个team
			Team team = new Team();
			team.setName("team1");

			Team team2 = new Team();
			team2.setName("team2");

			//创建6个student对象
			Student student = new Student();
			student.setAge(20);
			student.setName("zhangsan");
			student.setTeam(team);

			Student student2 = new Student();
			student2.setAge(24);
			student2.setName("lisi");
			student2.setTeam(team);

			Student student3 = new Student();
			student3.setAge(24);
			student3.setName("student3");
			student3.setTeam(team2);

			Student student4 = new Student();
			student4.setAge(24);
			student4.setName("student4");
			student4.setTeam(team2);

			Student student5 = new Student();
			student5.setAge(24);
			student5.setName("student5");
			student5.setTeam(team2);
			
			//前两个student属于team
			team.getStudents().add(student);
			team.getStudents().add(student2);

			//后三个student属于team2
			team2.getStudents().add(student3);
			team2.getStudents().add(student4);
			team2.getStudents().add(student5);

			//开启事务
			tx = session.beginTransaction();
			
			//保存team和team2
			session.save(team);
			session.save(team2);
			System.out.println("save success!");
			
			//提交事务
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			if (null != tx) {
				tx.rollback();
			}
		} finally {
			session.close();
		}
	}
}

控制打印sql如下:

save success!
Hibernate: insert into team_list (name, id) values (?, ?)
Hibernate: insert into student_list (card_id, name, age, team_id, id) values (?, ?, ?, ?, ?)
Hibernate: insert into student_list (card_id, name, age, team_id, id) values (?, ?, ?, ?, ?)
Hibernate: insert into team_list (name, id) values (?, ?)
Hibernate: insert into student_list (card_id, name, age, team_id, id) values (?, ?, ?, ?, ?)
Hibernate: insert into student_list (card_id, name, age, team_id, id) values (?, ?, ?, ?, ?)
Hibernate: insert into student_list (card_id, name, age, team_id, id) values (?, ?, ?, ?, ?)
Hibernate: update student_list set team_id=?, `index`=? where id=?
Hibernate: update student_list set team_id=?, `index`=? where id=?
Hibernate: update student_list set team_id=?, `index`=? where id=?
Hibernate: update student_list set team_id=?, `index`=? where id=?
Hibernate: update student_list set team_id=?, `index`=? where id=?

02-04插入的是team
05-08插入的是team2

09-13是对student_list表中外键team_id,和排序字段index的维护


student_list表中记录如下:


             id                    name    age           team_id
8a8adb7b34a45b700134a45b72130002 zhangsan  20  8a8adb7b34a45b700134a45b71fc00010
8a8adb7b34a45b700134a45b72130003 lisi      24  8a8adb7b34a45b700134a45b71fc00011
8a8adb7b34a45b700134a45b72130005 student3  24  8a8adb7b34a45b700134a45b721300040
8a8adb7b34a45b700134a45b72130006 student4  24  8a8adb7b34a45b700134a45b721300041
8a8adb7b34a45b700134a45b72140007 student5  24  8a8adb7b34a45b700134a45b721300042


team_list表中记录:

8a8adb7b34a467320134a46733cc0001	team1
8a8adb7b34a467320134a46733e40004	team2
分享到:
评论

相关推荐

    hibernate关联映射详解SSH 多对多,一对多关系对象映射

    本篇文章将深入探讨Hibernate中的一对多和多对多关系映射。 首先,让我们理解一对多关联映射。在数据库中,一对多关系意味着一个表中的记录可以与另一个表中的多个记录相关联。在Hibernate中,这可以通过在实体类中...

    Hibernate一对多映射配置详解

    在Java持久化框架Hibernate中,一对多映射是常见的实体关系映射类型,它表示一个实体(例如User)可以与多个其他实体(例如Account)相关联。以下是对Hibernate一对多映射配置的详解: 一、XML文件配置 1. 单向...

    hibernate对应关系详解

    5. **双向关系**:在一对一、一对多、多对一、多对多关系中,都可以设置双向关系,即双方都能访问到对方。这需要在双方实体上都添加相应的注解,并确保关系的维护一致性。 6. **继承关系映射**:Hibernate支持类的...

    hibernate对映射xml的一对多的双向关联详解

    在子类(如“课程”)的映射文件中,使用`&lt;many-to-one&gt;`元素来表示多对一的关系。`class`属性指定父类的全限定类名,`column`属性对应父类在子类表中的外键字段。 ```xml ``` 3. **双向关联的实现** 双向...

    hibernate 一对多,两个实例项目

    总结,"hibernate 一对多,两个实例项目"旨在帮助开发者深入理解Hibernate中的一对多关系映射,并通过实际项目实践来提升技能。通过这两个实例,我们可以学习到如何配置、操作以及优化一对多关系,从而在实际开发中...

    Hibernate ORM - 一对多双向连接表关联关系

    虽然描述部分为空,但根据标题,我们可以推断这篇文章可能详细介绍了如何在Hibernate中设置和管理一对多双向关联,包括配置XML映射文件、注解或者使用Java配置,以及如何在代码中处理这种关联关系。 **标签解析:**...

    Hibernate配置文件中映射元素详解

    - **多对多映射**:使用`&lt;bag&gt;`、`&lt;set&gt;`、`&lt;map&gt;`或`&lt;list&gt;`元素,配合`&lt;many-to-many&gt;`元素实现。 ### 组件映射 `&lt;component&gt;` 组件映射允许将一个对象的属性组合成另一个对象,`&lt;component&gt;`元素定义了子对象与...

    Hibernate_一对多增删改查数据

    在Java的持久化框架Hibernate中,关系映射是其核心特性之一,尤其是一对多(One-to-Many)关系的处理,它广泛存在于现实世界的业务场景中,如一个用户可以有多个订单,一个部门可以有多名员工等。本篇文章将深入探讨...

    hibernate包详解+hibernatePPT

    Hibernate 是一款开源的对象关系映射(ORM)框架,它为Java开发者提供了一种在关系数据库和面向对象编程之间架起桥梁的解决方案。通过使用Hibernate,开发人员可以避免直接编写SQL语句,而是用Java对象来操作数据库...

    Hibernate期末作业一对多(连接表)

    描述中的“Hibernate期末作业之连接表(一对多/多对一)”进一步指出,不仅会涉及一对多的关系,还可能包含多对一的关联。多对一关系是与一对多关系相反的情况,即多个实体可以关联到一个单一的实体。在实际的数据库...

    hibernate中一对多配置

    在多对一关系中,多个子类实例各自对应一个父类实例。在Hibernate中,它们的配置方式略有不同,但都通过外键实现关联。理解这些概念并正确配置,能帮助我们更有效地管理和操作数据库中的对象关系。

    Hibernate映射关联详解

    在关系型数据库设计中,一对多关联是常见的数据组织方式之一。而在面向对象编程语言中,这种关系则通常通过集合(如Set或List)来实现。本文将重点探讨如何在Hibernate框架下实现一对多双向关联。 #### 二、基本...

    hibernate一对多实例

    在这个“hibernate一对多实例”中,我们将深入探讨如何在Hibernate中实现一对多的关系,这是一种常见的关联类型,其中一方实体可以与多方实体相对应。 一、Hibernate一对多关系 在数据库设计中,一对多关系表示一...

    Hibernate映射配置详解

    在Java世界中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它允许开发者将数据库操作转换为对Java对象的操作,极大地简化了数据库编程。SSH是Spring、Struts和Hibernate三个开源框架的简称,常被用于构建...

    Hibernate的配置详解

    在本篇中,我们将深入探讨Hibernate的配置,特别是涉及一对一、一对多和多对多关系的配置。 首先,配置过程始于`Configuration`接口。这个接口用于设置Hibernate所需的配置信息,如数据源、连接参数等,并根据配置...

    Hibernate关联映射

    一对一关联适用于实体间一对一的关系,一对多适用于一个实体可以拥有多个子实体的情况,而多对多则适用于两个实体之间存在多对多的关系。理解这些关联类型及其配置对于设计高效、灵活的 ORM 解决方案至关重要。

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

    在 Hibernate 中,集合映射是指将 Java 集合类型与数据库表之间的映射关系。常见的集合映射类型有 Set、List、Array、Map 和 Bag 等,每种类型都有其特点和应用场景。 Set 集合映射 Set 集合是 Hibernate 中基础的...

    hibernate多表查询详解

    在Java的持久化框架中,Hibernate是一个广泛使用的ORM(对象关系映射)工具,它允许开发者用面向对象的方式来处理数据库操作。在实际的业务场景中,数据往往不是孤立存在的,而是存在于多个关联的表中。因此,多表...

    [原]Hibernate集合映射

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

    Hibernate3.x关联映射示例

    关联映射是Hibernate中的核心概念之一,它允许我们将数据库中的表关系映射到对象之间的关系。主要的关联类型有以下几种: 1. **一对一(One-to-One)关联**:一个实体对应另一个实体的唯一实例。在数据库中,通常...

Global site tag (gtag.js) - Google Analytics