Hibernate关系映射总结(二)

这章总结下一对多单向关联,还是采用上章的例子,一个人对应多个座位,即一个User对应多个Seat.

在Seat表中添加一列user_id,用于关联User表。

进入mysql数据库cmd界面,执行语句:

alter table seat add column user_id char(32)  ;

修改User.java,增加一Set属性,代表所引用的seat集合:


package  com.mp.persistence.model;

import
 java.util.Set;

public class
 User
{

    
private
 String        id;
    
private
 String        name;
    
private Set<Seat>
    seats;

    
public Set<Seat>
 getSeats()
    
{
        
return
 seats;
    }


    
public void setSeats(Set<Seat> seats)
    
{
        
this.seats =
 seats;
    }


    
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 void addSeat(Seat seat)
    
{
        seats.add(seat);
    }


    
public void removeSeat(Seat seat)
    
{
        seats.remove(seat);
    }

}

Seat.java 增加一属性user_id ,标识所属于的User:


package  com.mp.persistence.model;

public class
 Seat
{

    
private
 String    id;
    
private
 String    user_id;
    
private
 String    place;

    
public
 String getId()
    
{
        
return
 id;
    }



    
public void setId(String id)
    
{
        
this.id =
 id;
    }


    
public String getPlace()
    
{
        
return
 place;
    }


    
public void setPlace(String place)
    
{
        
this.place =
 place;
    }



    
    
public String getUser_id()
    
{
        
return
 user_id;
    }



    
    
public void setUser_id(String user_id)
    
{
        
this.user_id =
 user_id;
    }

}

User.hbm.xml中增加set映射标签:

其中<set>中的 name与User.java 里的seats属性对应。key column 代表关联对象Seat中的关联字段,与Seat.java中的user_id属性对应,<one-to-many class 指定所关联的类。

<?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.mp.persistence.model.User" table="user">
        
<id name="id" column="id" type="java.lang.String">
            
<generator class="uuid" />
        
</id>
        
<property name="name" column="name" type="java.lang.String" />
        
        
<set name="seats" table="seat" cascade="all">
            
<key column="user_id" />
            
<one-to-many class="com.mp.persistence.model.Seat" />
        
</set>
    
</class>
</hibernate-mapping>

Seat.hbm.xml文件中增加user_id property:

因为是User单向关联Seat,即通过User可以get到它所关联的Seat,而Seat不需要也不能get到它关联的User,Seat为被动对象,所以Seat.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.mp.persistence.model.Seat" table="seat">
        
<id name="id" column="id" type="java.lang.String">
            
<generator class="uuid" />
        
</id>
        
<property name="user_id" column="user_id" type="java.lang.String" />
        
<property name="place" column="place" type="java.lang.String" />
    
</class>
</hibernate-mapping>

修改测试代码TestHibernate.java:

package  com.mp.persistence.model;

import
 java.util.HashSet;
import
 java.util.Set;

import
 org.hibernate.Session;
import
 org.hibernate.SessionFactory;
import
 org.hibernate.Transaction;
import
 org.hibernate.cfg.Configuration;

/**
 * 类功能描述:测试hibernate映射关系
 *
 * 
@author <a href="mailto:likunwangyi@163.com">likun </a>
 * 
@version
 $Id: codetemplates.xml,v 1.1 2007/12/07 02:35:38 likun Exp  $
 * Create:  2008-1-3 下午01:00:21
 
*/

public class  TestHibernate
{

    
public static void
 main(String[] args)
    
{
        
// 获得hibernate.cfg.xml配置信息    

        Configuration config = new Configuration().configure();
        
//
 根据 config 建立 SessionFactory       
        
// SessionFactory 将用于建立 Session      

        SessionFactory sessionFactory = config.buildSessionFactory();
        
        Seat seat 
= new
 Seat();
        seat.setPlace(
"三排一列"
);
        Seat seat2 
= new
 Seat();
        seat2.setPlace(
"三排二列"
);
        
        User user 
= new
 User();
        user.setName(
"a"
);
        user.setSeats(
new
 HashSet());
        user.addSeat(seat);
        user.addSeat(seat2);
        
        
// 开启Session,相当于开启JDBC的Connection       

        Session session = sessionFactory.openSession();
        Transaction tx 
=
 session.beginTransaction();
        
// 保存实体类至数据库中     

        session.save(user);
        tx.commit();
        session.close();
        sessionFactory.close();
        System.out.println(
"操作成功!"
);
    }

}

因为前面在User.hbm.xml中设置了cascade="all" ,所以这里只需save(user)就可以,它会关联保存seat对象。

右键TestHibernate.java,Run as /JavaApplication ,控制台显示:

Hibernate: insert into user (name, id) values (?,  ?)
Hibernate: insert into seat (user_id
, place, id) values (?, ?,
 ?)
Hibernate: insert into seat (user_id
, place, id) values (?, ?,
 ?)
Hibernate: update seat set user_id
=? where id=
?
Hibernate: update seat set user_id
=? where id=
?
操作成功!

切换到cmd,执行查询语句,查看结果如下:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值