您的位置:首页 > 其它

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

2012-01-04 00:19 337 查看
场景:一个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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: