Hibernate关系(一对多)
在Hibernate关系中有三种关系:一对一,一对多,多对多;
但在平常应用中,一对多关系应用较多,在这关系中主要有三种映射:Set,List,Map.
他们都是在一的那方的pojo中加了一个Set,List,Map的属性集合,只是在建表和写映射文件的时候Set映射与另外两种映射存在一些差异.
下面用一个例子来进行说明:
完成一个人和邮件地址的关系。
设计表:
人:userid,name,age,birthday
邮件地址表: userid、email,使用复合主键
Set
1、建立表
CREATE TABLE user (
userid varchar(18) primary key ,
name varchar(20) not null,
age int not null,
birthday date not null
);
CREATE TABLE email (
userid varchar(18) not null,
email varchar(50) not null,
primary key (userid,email)
);
2、生成映射
生成映射,只生成user的映射类。
在pojo中加入一个Set集合,该集合的泛型为String类型
package org.pojo;
import java.util.Date;
import java.util.Set;
import java.util.TreeSet;
public class User implements java.io.Serializable {
private String userid;
private String name;
private Integer age;
private Date birthday;
private Set<String> emails = new TreeSet<String>();
public User() {
}
public User(String userid, String name, Integer age, Date birthday) {
this.userid = userid;
this.name = name;
this.age = age;
this.birthday = birthday;
}
//下面的get(),set()略
3、映射文件
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="org.liky.pojo.User" table="user" catalog="testdb">
<id name="userid" type="java.lang.String">
<column name="userid" length="18" />
<generator class="assigned" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="20" not-null="true" />
</property>
<property name="age" type="java.lang.Integer">
<column name="age" not-null="true" />
</property>
<property name="birthday" type="java.util.Date">
<column name="birthday" length="10" not-null="true" />
</property>
<!-- 表示User中包含一个Set类型的属性,在该集合中保存的数据与email表有关系 -->
<set name="emails" table="email">
<!-- 在表email中通过userid与user表关联 -->
<key column="userid"></key>
<!-- 表示Set集合中保存的数据类型,和该数据所对应的表的字段,这里集合中所保存的数据对应表中的email列 -->
<element type="java.lang.String" column="email"></element>
</set>
</class>
</hibernate-mapping>
cascade=””可以就这个属性来说明联级。
List
list:映射,可以允许重复,而且可以依据下标直接取得对象。
list映射和set映射的区别在于是否允许数据重复。
在表的设计上有区别
list方式映射时,表中包含三个字段,多一个下标的字段,用来区分内容相同的数据。
主键改为3主键
建立表
User表结构与上面相同
CREATE TABLE email (
userid varchar(18) not null,
email varchar(50) not null,
indexid int not null,
primary key (userid,email,indexid)
);
2、生成映射
只是把上面的Set换成下面的List
private List<String> emails = new ArrayList<String>();
3、映射文件
<list name="emails" table="email">
<!-- 在表email中通过userid与user表关联 -->
<key column="userid"></key>
<!-- 需要包含一个索引号,表示indexid为索引列,类型为Integer -->
<index column="indexid" type="java.lang.Integer"></index>
<!-- 表示List集合中保存的数据类型,和该数据所对应的表的字段,这里集合中所保存的数据对应表中的email列 -->
<element type="java.lang.String" column="email"></element>
</list>
Map
Map:使用key与value的形式保存数据。
表需要修改,改为3个字段,修改为key与value的形式
建立表
CREATE TABLE email (
userid varchar(18) not null,
email varchar(50) not null,
keyss varchar(20) not null,
primary key (userid,email,keyss)
);
2、生成映射
private Map<String, String> emails = new TreeMap<String, String>();
3、映射文件
<map name="emails" table="email">
<key column="userid"></key>
<index column="keyss" type="java.lang.String"></index>
<element type="java.lang.String" column="email"></element>
</map>