hibernate映射(一) 之Hibernate单项多对一映射

来源:互联网 发布:淘宝客服晚班可在家上 编辑:程序博客网 时间:2024/06/14 19:24

数据库sql

DROP TABLE IF EXISTS `person`;CREATE TABLE `person` (  `person_id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(20) DEFAULT NULL,  `address_id` int(11) DEFAULT NULL,  PRIMARY KEY (`person_id`)) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `address`;CREATE TABLE `address` (  `address_id` int(11) NOT NULL AUTO_INCREMENT,  `address` varchar(50) DEFAULT NULL,  PRIMARY KEY (`address_id`)) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8;



Person实体类

package org.lei.model;import java.io.Serializable;public class Person implements Serializable{private Integer personId;private String name;private Address address;public Integer getPersonId() {return personId;}public void setPersonId(Integer personId) {this.personId = personId;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}public Person(){}}

Address实体类

package org.lei.model;import java.io.Serializable;public class Address implements Serializable{private Integer addressId;private String address;public Address(){}public Integer getAddressId() {return addressId;}public void setAddressId(Integer addressId) {this.addressId = addressId;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}}

person.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 = "org.lei.model.Person" table="person">            <id name = "personId" type="java.lang.Integer">                <column name="person_id"/>                <generator class="native"></generator>            </id>                        <property name ="name" type="java.lang.String">                <column name="name" length="10"/>            </property>            <many-to-one name="address" column="address_id"                class="org.lei.model.Address" outer-join="true"                cascade="save-update">            </many-to-one>          <!--   Hibernate outer-join参数允许下列三个不同值: auto:(默认) 使用外连接抓取关联(对象),如果被关联的对象没有代理(proxy) true:一直使用外连接来抓取关联 false:永远不使用外连接来抓取关联  -->        </class>    </hibernate-mapping>

address.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 ="org.lei.model.Address" table="address" >            <id name="addressId" type="java.lang.Integer">                <column name="address_id"/>                <generator class="native" >                </generator>            </id>            <property name ="address" type="java.lang.String">                <column name ="address" length="50"/>            </property>        </class>    </hibernate-mapping>

Test类

package com.test;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.lei.model.Address;import org.lei.model.Person;public class TestPersonAddress {public static void main(String []args){//configuration 管理hibernate配置Configuration configuration = new Configuration().configure();//根据Configuration建立SessionFatorySessionFactory sessionFactory = configuration.buildSessionFactory();Address address1 = new Address();address1.setAddress("address1");Address address2 = new Address();address2.setAddress("address2");Person person1 = new Person();Person person2 = new Person();Person person3 = new Person();person1.setName("person1");person1.setAddress(address1);person2.setName("person2");person2.setAddress(address2);person3.setName("person3");person3.setAddress(address1);Integer pid = null ;//定义主键变量Session session = sessionFactory.openSession();//添加数据Transaction tx = null;//开始事务try{tx = session.beginTransaction();//创建主键变量pid = (Integer)session.save(person1);session.save(person2);session.save(person3);tx.commit();}catch (RuntimeException e){if(tx!=null){tx.rollback();throw e;}}finally{session.close();}/** * 修改person1,并修改对应的地址为address */session = sessionFactory.openSession();tx = null;try {tx = session.beginTransaction();person1 = (Person)session.get(Person.class, pid);person1.setName("person1 update");person1.getAddress().setAddress("address1 update");session.update(person1);tx.commit();} catch (RuntimeException e){if(tx!=null){tx.rollback();throw e;}}finally{session.close();}/** * 查询数据 */session = sessionFactory.openSession();tx = session.beginTransaction();person1 = (Person)session.get(Person.class, pid);System.out.println("person name :" +person1.getName());System.out.println("person address :"+person1.getAddress().getAddress());session.close();/** * 删除数据 */session = sessionFactory.openSession();tx = null;//开始事务try {tx = session.beginTransaction();person1 = (Person) session.get(Person.class, pid);session.delete(person1);tx.commit();} catch (RuntimeException e){if(tx!=null){tx.rollback();throw e;}}finally{session.close();}/** * 反向添加数据 */Address address3 = new Address();address3.setAddress("address3");session = sessionFactory.openSession();tx = null;try {tx = session.beginTransaction();session.save(address3);tx.commit();}catch (RuntimeException e){if(tx!=null){tx.rollback();throw e;}}finally{session.close();}sessionFactory.close();//关闭sessionfactory}}

关键总结

1、注意理解person.hbm.xml映射文件
2、由于是多对一关系,控制方Person需要增加Address属性,用来表示对应一个Address。
3、多对一使用many-to-one元素
4、cascade属性表示当空置方(Person)在进行添加、修改‘、删除时,是否关联被控制方(Address)。这里是save-update,即在添加、修改时关联
5、outer-join设置为true,即在查询关联对象时,一个sql语句就可以查出;如果设置为false,则使用抖个sql语句查出数据

原工程下载地址http://download.csdn.net/detail/renlei0109/7323803

0 0
原创粉丝点击