Hibernate关系(一对多)

 

Hibernate关系(一对多)

Hibernate关系中有三种关系:一对一,一对多,多对多;

但在平常应用中,一对多关系应用较多,在这关系中主要有三种映射:Set,List,Map.

他们都是在一的那方的pojo中加了一个Set,List,Map的属性集合,只是在建表和写映射文件的时候Set映射与另外两种映射存在一些差异.

下面用一个例子来进行说明:

完成一个人和邮件地址的关系。

设计表:

人:useridnameagebirthday

邮件地址表: useridemail,使用复合主键

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中通过useriduser表关联 -->

           <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中通过useriduser表关联 -->

           <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:使用keyvalue的形式保存数据。

表需要修改,改为3个字段,修改为keyvalue的形式

建立表

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>

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值