hibernate中List一对多映射关系详解
2012-01-04 00:19
337 查看
场景:一个Team对一个多个Student,其中Team中的studes属性为List类型
直接上代码,测试通过的:
Team.java
Studeng.java
以下三个配置文件均放在src根目录下:
hibernate主配置文件:
hibernate.cfg.xml
一方配置文件: Team.hbm.xml
多方配置文件 : Studeng.hbm.xml
根据以上三个配置文件,可以生成对应的数据库表,代码如下:
CreateTable.java
运行CreateTable.java 生成对应表,后台打印sql如下:
ok,表已经创建成功,下面测试保存操作:
InsertTest.java
控制打印sql如下:
02-04插入的是team
05-08插入的是team2
09-13是对student_list表中外键team_id,和排序字段index的维护
student_list表中记录如下:
team_list表中记录:
8a8adb7b34a467320134a46733cc0001 team1
8a8adb7b34a467320134a46733e40004 team2
直接上代码,测试通过的:
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中List一对多映射关系详解
- 关于hibernate中持久化类之间的映射关系的详解(一)
- hibernate学习(1):hibernate基本架构和关系映射详解
- Hibernate两种实体关系映射详解
- Hibernate之关系对象映射详解
- hibernate复杂映射关系下的删除操作和list类型映射的注意点
- Hibernate对象关系映射详解之“一对多”关系映射
- Hibernate中映射关系 一对一 详解
- JAVAWEB开发之Hibernate详解(四)——持久化类的继承映射关系
- Hibernate 学习之路(四):详解 hibernate 映射文件(二)和组件映射关系
- SSH——Hibernate继承关系映射详解(配置+实例+总结)
- 类文件Hibernate 之List ,Bag,Map三种映射文件详解
- Hibernate关系映射详解
- 详解Java的Hibernate框架中的List映射表与Bag映射
- Hibernate中 多对一,一对多映射关系分析详解
- Hibernate 关系映射配置inverse与cascade详解
- hibernate映射详解之: 对象 - 关系映射
- JAVAWEB开发之Hibernate详解(四)——持久化类的继承映射关系
- Hibernate框架详解(三)框架中的关系映射
- 关于hibernate中持久化类之间的映射关系的详解(一)