读书人

Hibernate联系关系映射-one to many外

发布时间: 2012-10-07 17:28:51 作者: rapoo

Hibernate关联映射-one to many外键单向关联

以下是说明,1对多 单向外键关联 的实例.同样以person 和 address 为例.

?

?

为了方便测试,在原有的Hibernate框架上面,建立两个hbm.xml文件..

一个是Address_One_to_Many.hbm.xml,另外一个是Person_One_to_Many.hbm.xml。

然后,建立两个JavaBean 分别是:Address_One_to_Many 和 Person_One_to_Many

?

?

Person_One_to_Many具体内容如下:

/** * 1对多,单向关联 * @author Administrator * */public class Person_One_to_Many implements Serializable{private static final long serialVersionUID = -6313867775683964530L;private Integer id;private String name;private Integer age;//一个人,有多个地址;private Set<Address_One_to_Many> setAddress = new HashSet<Address_One_to_Many>();                      //getter 和 setter 方法省略}

?

?

Address_One_to_Many 具体代码如下:

/** *  * 一对多的关系; * @author Administrator * */public class Address_One_to_Many implements Serializable{private static final long serialVersionUID = 3635140598485086087L;private Integer addressID;private String addressDetail;                               //getter 和 setter方法省略.}

?

?

接下来就是配置Mapping映射文档.

Person_One_to_Many.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 package="pack.java.model"><class name="Person_One_to_Many" table="ZHT_Person_One_To_Many"><id name="id" column="ID" type="java.lang.Integer"><!-- mySql中主键id自动生成. --><generator column="NAME" type="java.lang.String"></property><property name="age" column="AGE" type="java.lang.Integer"></property><!-- 设置Address地址set集合,inverse = false代表主控制端; lazy=false代表不延迟加载.table=ADDRESS_ONE_TO_MANY 指定数据库的ADDRESSS一张表;方便关联查询;cascade=all 支持所有的级联操作;--><set name="setAddress" inverse="false" lazy="false" table="ADDRESS_ONE_TO_MANY" cascade="all"><!-- 确定关联的外键列,可以任意取个名字;--><key column="id" not-null="false"></key><!-- 1个人多对应多个地址,所以class指向的是Address --><one-to-many name="code"><?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 package="pack.java.model"> <class name="Address_One_to_Many" table="ADDRESS_ONE_TO_MANY">  <id column="ADDRESS_ID" name="addressID" type="java.lang.Integer">   <generator name="addressDetail" column="ADDRESS_DETAIL" not-null="true"/> </class></hibernate-mapping>

?

?

配置完之后,记得在Hibernate.cfg.xml中加上 刚才新建xxx.hbm.xml文件的映射地址:

比如:

<mapping resource="pack/java/model/Address_One_to_Many.hbm.xml"/>
<mapping resource="pack/java/model/Person_One_to_Many.hbm.xml"/>

?

?

最后,在建立一个Test类进行测试刚刚配置的1对多的映射关系.

package pack.java.test;import java.io.Serializable;import java.util.Set;import org.hibernate.Session;import pack.java.hibernate.HibernateSessionFactory;import pack.java.model.Address_One_to_Many;import pack.java.model.Person_One_to_Many;/** *  * Hibernate 测试类; 一对多外键单向关联; * @author ZhouHaiTao * */public class HibernateDemoOneToMany {public static void main(String[] args) {HibernateDemoOneToMany hibernateDemoOneToMany = new HibernateDemoOneToMany();//保存地址;hibernateDemoOneToMany.saveAddress();//保存人物;hibernateDemoOneToMany.savePerson();//根据Person id查询person;hibernateDemoOneToMany.loadPersonByID(1);}/** * 保存Address地址; */private void saveAddress(){Session session = getSession();Address_One_to_Many address1 = new Address_One_to_Many();address1.setAddressDetail("湖南省株洲市");Address_One_to_Many address2 = new Address_One_to_Many();address2.setAddressDetail("广东省深圳市");Address_One_to_Many address3 = new Address_One_to_Many();address3.setAddressDetail("湖北省武汉市");//开始事务;session.beginTransaction().begin();//单独保存地址;session.save(address1);session.save(address2);session.save(address3);//提交事务;session.beginTransaction().commit();//关闭session;closeSession(session);}/** * 保存Person,并且给Person指定多个地址; */private void savePerson(){//获取session;Session session = getSession();Person_One_to_Many person1 = new Person_One_to_Many("李四",23);Person_One_to_Many person2 = new Person_One_to_Many("张三",23);Address_One_to_Many address1 = new Address_One_to_Many();address1.setAddressDetail("湖南省株洲市");Address_One_to_Many address2 = new Address_One_to_Many();address2.setAddressDetail("广东省深圳市");Address_One_to_Many address3 = new Address_One_to_Many();address3.setAddressDetail("湖北省武汉市");session.beginTransaction().begin();//给添加person1对象添加两个地址;person1.getSetAddress().add(address1);person1.getSetAddress().add(address2);//给person2对象,添加一个地址;person2.getSetAddress().add(address3);session.save(person1);session.save(person2);session.beginTransaction().commit();//关闭session;closeSession(session);}/** * 根据person id查询出,person对象,以及地址; * @param id */private void loadPersonByID(Serializable id){Session session = getSession();Person_One_to_Many personOneToMany = (Person_One_to_Many) session.load(Person_One_to_Many.class, id);System.out.println("打印出Person中的属性信息:");System.out.println(personOneToMany.getId()+","+personOneToMany.getName()+","+personOneToMany.getAge());Set<Address_One_to_Many> addressOneToManies = personOneToMany.getSetAddress();System.out.println("\n打印出Address中的信息:");for(Address_One_to_Many  addressOneToMany : addressOneToManies){System.out.println(addressOneToMany.getAddressID()+","+addressOneToMany.getAddressDetail());}closeSession(session);}/** * 创建session; * @return */private static Session getSession(){return HibernateSessionFactory.getSession();}/** * 创建session; * @return */private static void closeSession(Session session){session.close();}}

?

?

测试之后,可以在MySql中查看数据数据是否正常插入成功..

?

以下是控制台输出的信息,代表成功插入数据库:

?

打印出Person中的属性信息:
1,周海涛,23

打印出Address中的信息:
5,湖南省株洲市
4,广东省深圳市

?

读书人网 >编程

热点推荐