这章总结下一对多单向关联,还是采用上章的例子,一个人对应多个座位,即一个User对应多个Seat.
在Seat表中添加一列user_id,用于关联User表。
![](http://www.best4c.com/Best4cUserFiles/20080103/17143_1199343727826.jpg)
进入mysql数据库cmd界面,执行语句:
alter table seat add column user_id char(32) ;
修改User.java,增加一Set属性,代表所引用的seat集合:
package
com.mp.persistence.model;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
import
java.util.Set;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
public class
User
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private String id;
private String name;
private Set<Seat> seats;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public Set<Seat> getSeats()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return seats;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public void setSeats(Set<Seat> seats)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
this.seats = seats;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public String getId()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return id;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public void setId(String id)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
this.id = id;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public String getName()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return name;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public void setName(String name)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
this.name = name;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public void addSeat(Seat seat)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
seats.add(seat);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public void removeSeat(Seat seat)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
seats.remove(seat);
}
}
Seat.java 增加一属性user_id ,标识所属于的User:
package
com.mp.persistence.model;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
public class
Seat
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private String id;
private String user_id;
private String place;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public String getId()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return id;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public void setId(String id)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
this.id = id;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public String getPlace()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return place;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public void setPlace(String place)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
this.place = place;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public String getUser_id()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return user_id;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public void setUser_id(String user_id)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
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;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
import
java.util.HashSet;
import
java.util.Set;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
import
org.hibernate.Session;
import
org.hibernate.SessionFactory;
import
org.hibernate.Transaction;
import
org.hibernate.cfg.Configuration;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/** */
/**
* 类功能描述:测试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
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public static void main(String[] args)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
// 获得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,执行查询语句,查看结果如下:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/lovelyhermione/1.jpg)