hibernate映射list类型

      当属性为list类型的时候,我们该怎样生成映射文件呢?

   我们知道List最重要的特性就是它是有序的,那么我们的问题就集中在了如何维持这个有序性?最简单的方法就是每个在list集合中的元素,他自己有一个编号,能告诉list他是第几个元素,这样是不是就能解决了呢?hibernate映射list集合确实是这样子做的。

   

   就像上面的这张表一张,xx在teamid为1中,他是第1个元素

                                        yy在teamid为1中,他是第2个元素。

                                        oo在teamid为1中,他是第3个元素。

    所以list中的元素中对应的表中应该多增加一个index字段维护顺序。

    就像下面的配置文件一样:

    

      <list name="members" table="member" cascade="all">
          <key column="teamid"/>
          <index column="index_"/>
          <one-to-many class="com.shizhan.po.Member"/>
        </list>

     index标签就是为member表多增加了一个字段index_用来维护这个顺序,有了这个歌顺序以后,hibernate就知道怎么往list中填充元素了。


     下面是完整的例子。

      一个team中,有许多member,且member是有序的,用list存储。

     Team类:

     

package com.shizhan.po;

import java.util.ArrayList;
import java.util.List;

public class Team {
	
	private long   id ;
	private String name ;
	private List  members = new ArrayList();
	
	public long getId() {
		return id;
	}
	
	public void setId(long id) {
		this.id = id;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}

	public List getMembers() {
		return members;
	}

	public void setMembers(List members) {
		this.members = members;
	}
	
	
	


}

   Member类:

 

    

package com.shizhan.po;

public class Member {
   
	private Long id ;
	private String name;
	private int age ;
	private Team team ;
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	
	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;
	}
	
	@Override
	public String toString() {
		return "Member [id=" + id + ", name=" + name + ", age=" + age
				+ "]";
	}
	
}

    Team.hbm.xml


    

<?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">


<hibernate-mapping>

   <class  name="com.shizhan.po.Team" table="team">
   
        <id name="id" type="java.lang.Long">  
            <generator class="increment" />  
        </id>  
        
        <property name="name" />  
        
        
        <list name="members" table="member" cascade="all">
          <key column="teamid"/>
          <index column="index_"/>
          <one-to-many class="com.shizhan.po.Member"/>
        </list>
        
        
   </class>
    
</hibernate-mapping>  


    Member.hbm.xml

   

    

<?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">


<hibernate-mapping>

   <class  name="com.shizhan.po.Member" table="member">
   
        <id name="id" type="java.lang.Long">  
            <generator class="increment" />  
        </id>  
      
        <property name="name" type="java.lang.String"/>  
        
        <property name="age" type="int"/>  
          
        <many-to-one name="team" column="teamid"></many-to-one>
         
   </class>
    
</hibernate-mapping> 

     看下hibernate帮我们定义的表的ddl语句:


     

 create table member (
        id number(19,0) not null,
        name varchar2(255 char),
        age number(10,0),
        teamid number(19,0),
        index_ number(10,0),
        primary key (id)
    )

    create table team (
        id number(19,0) not null,
        name varchar2(255 char),
        primary key (id)
    )

    alter table member 
        add constraint FKBFC28A9A5FDC8E78 
        foreign key (teamid) 
        references team

   member类并没有定义index_,这是list标签下的index标签,帮我们生成的。

   外键是由list标签下的key生成的。


   测试一下数据:

  

 	Session session = DBUtil.getSession();
    	Transaction tx = session.beginTransaction();
    	
    	try {
			Team t1 = new Team();
			t1.setName("非师三班");
			
			
			List members = new ArrayList();
			
			Member m1 = new Member();
			m1.setAge(20);
			m1.setName("xx");
			m1.setTeam(t1);
			
			Member m2 = new Member();
			m2.setAge(22);
			m2.setName("yy");
			m2.setTeam(t1);
			
			
			Member m3 = new Member();
			m3.setAge(29);
			m3.setName("oo");
			m3.setTeam(t1);
			
			
		    members.add(m1);
		    members.add(m2);
		    members.add(m3);
		    
			t1.setMembers(members);
			
			session.save(t1);
			tx.commit();
		} catch (Exception e) {
			tx.rollback();
			e.printStackTrace();
		} finally{
			session.close();
		}

   sql语句:

   

Hibernate: 
    select
        max(id) 
    from
        team
Hibernate: 
    select
        max(id) 
    from
        member
Hibernate: 
    insert 
    into
        team
        (name, id) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        member
        (name, age, teamid, id) 
    values
        (?, ?, ?, ?)
Hibernate: 
    insert 
    into
        member
        (name, age, teamid, id) 
    values
        (?, ?, ?, ?)
Hibernate: 
    insert 
    into
        member
        (name, age, teamid, id) 
    values
        (?, ?, ?, ?)
Hibernate: 
    update
        member 
    set
        teamid=?,
        index_=? 
    where
        id=?
Hibernate: 
    update
        member 
    set
        teamid=?,
        index_=? 
    where
        id=?
Hibernate: 
    update
        member 
    set
        teamid=?,
        index_=? 
    where
        id=?

   可以看到插入member后,不止更新了其teamid外键,还更新了index_键,用来维护顺序。

   这时候表中的数据是:

   


    和我们插入的顺序是一样的。

   

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值