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

数据库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建立SessionFatory
		SessionFactory 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值