hibernate一对一关联关系(一)

hibernate一对一关联关系(1)
对hibernate一对一关联关系进行简单的分析,可供初学者参考,还提供源代码下载.
hibernate一对一唯一外键关联映射(双向关联Customer<---->Address)
一对一唯一外键关联双向,需要在两个配置文件中添加<one-to-one>标签,指示hibernate如何加载,确定两个表是一对一的关系 ,因为一个用户只能对应一个地址,因此Address表中的主键值来自于Customer表的主键值,即主键共享.
映射方式:
Address持久化类对应的配置文件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 package="cn.com.hibernate.one_to2_one">
	<class name="Address" table="Address">
	   <id name="id" column="ID" > 
	   <!--Address表的主健生成策略引用Customers表的主健, -->
		<generator class="foreign">
			<param name="property">customer</param>
		</generator>
	    </id>			
	    <!--属性对应字段 -->
	    <property name="city"></property>
	    <property name="phone"></property>
	    <!-- one-to-one 来配置表一对一的关联关系,constrained="true" 表示Customer表中的主键共享,当前表中的主键引用Customer表中的主键,-->
	   <one-to-one name="customer" class="Customer" constrained="true" cascade="all"></one-to-one>		
	</class>
</hibernate-mapping>

Customer持久化类对应的配置文件Customer.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="cn.com.hibernate.one_to2_one">
		
	<!--class 配置POJO与表的关联关系 -->
	<!-- name: POJO的名字 table:表名-->
	<class name="Customer" table="CUSTOMERS">			
		<!-- id:配置POJO中的id与表中主健的对应 -->
		<id name="id" column="ID">
			<!--generator:主健生成策略  -->
			<generator class="native"></generator>
		</id>
			
	<!-- 配置表中的字段 name:pojo属性名   column:对应基本表中的列名
		不写column属性,默认基本表的字段名与pojo属性相同  -->
	<property name="username"column="USERNAME"></property>
			
	<!-- 配置表中外键字段-->
	<!-- 配置一对一关联关系,one-to-one,-->
	<one-to-one name="address" class="Address" cascade="all">
         </one-to-one>
	</class> 	
</hibernate-mapping> 

Address类
package cn.com.hibernate.one_to2_one;
/**
 * title:Address
 *
 */
public class Address {
	
	private long id;
	private String city;
	private String phone;
	
	//用户持久化类作为属性
	private Customer customer;
	
	public Address( String city,String phone){
		
		this.city = city;
		this.phone = phone;
	}
	
	public Customer getCustomer() {
		return customer;
	}
	public void setCustomer(Customer customer) {
		this.customer = customer;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public long getId() {
		return id;
	}
	private void setId(long id) {
		this.id = id;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}	
}

Customer类
package cn.com.hibernate.one_to2_one;

/**
 * title:用户pojo持久化类,
 *
 */
public class Customer {
	
	private long id;//id 区分数据表中每一条元组  sort int long	
	private String username;	
	private Address address;//Address对象作为属性

	//构造方法
	public Customer( String username ){		
		this.username = username;
	}
	
	//无参 
	public Customer(){		
	}
	
	public Address getAddress() {
		return address;
	}

	public void setAddress(Address address) {
		this.address = address;
	}

	public long getId() {
		return id;
	}
	
	//防止修改POJO中的主键,用private 
	private  void setId(long id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}
	public  void setUsername(String username) {
		this.username = username;
	}
}

单元测试类 
package cn.com.hibernate.one_to2_one;

import org.hibernate.Session;
import org.hibernate.Transaction;
import cn.com.hibernate.tool.HibernateTools;

public class TestOne2One {
	/**
	 *title:测试一对一的关系,双向关联
	 * @param args
	 */
	public static void main(String[] args) {

		//session
		Session session = HibernateTools.getSession();
		
		//Transaction
		Transaction tran = session.beginTransaction();
		
		tran.begin();
		try{			
			//Address表
			Address add = new Address( "长沙","1205" );
			
			//Customer用户表,
			Customer cu = new Customer( "QQ");
			cu.setAddress( add );
			add.setCustomer( cu );
			
			//save();
			session.save( add );		
			tran.commit();
			
		} catch( Exception e){			
			e.printStackTrace();
			tran.rollback();
		}		
	}
}