一对多映射配置文件hbm.xml以及级联_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 一对多映射配置文件hbm.xml以及级联

一对多映射配置文件hbm.xml以及级联

 2013/11/16 12:38:40  alleni123  程序员俱乐部  我要评论(0)
  • 摘要:有两个类,一个是User,一个是Order一个User可以包含多个Order对象。packagecom.lj.zhang;importjava.util.Set;publicclassUser{privateintid;privateStringname;//一对多,通过该变量可以引用到对应的Order集合对象privateSet<Order>orders;publicSet<Order>getOrders(){returnorders;
  • 标签:配置文件 文件 配置 XML
有两个类, 一个是User, 一个是Order
一个User可以包含多个Order对象。

class="java" name="code">package com.lj.zhang;

import java.util.Set;

public class User
{
	private int id;
	
	private String name;
	
	
	//一对多, 通过该变量可以引用到对应的Order集合对象
	private Set<Order>orders;
	 
	

	public Set<Order> getOrders()
	{
		return orders;
	}

	public void setOrders(Set<Order> orders)
	{
		this.orders = orders;
	}

	

	public User(int id, String name)
	{
		super();
		this.id = id;
		this.name = name;
	}
	
	public User()
	{
		// TODO Auto-generated constructor stub
	}
	
	
}	

package com.lj.zhang;

public class Order
{	
	
	@Id
	private int id;
	
	private String name;
	
	
	//多对一, 多个order通过引用可以对应到关联的User对象。
	private User user;
	
	

	public User getUser()
	{
		return user;
	}

	public void setUser(User user)
	{
		this.user = user;
	}
	
	
	
}


	
	


==============级联==========
假如有一个User对象user1, 对应有三个Order对象order1,order2,order3
当保存user1时, 按照道理, 这三个Order对象也会被保存起来。
在上面的例子中, 通过
<set name="orders" cascade="save-update" inverse="true">
来设置这个关联。  inverse=true表示由order来维持这个关系。
==============级联==========



<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
  "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
          
  <hibernate-mapping package="com.lj.zhang">
  	<class name="Order" table="test_order">
  			<id name="id">
  				<generator class="assigned"/>
  			</id>
  			 <property name="name" column="test_name"/>
  			
  		
  		<!-- 告诉hibernate, 多对一映射的对象是什么类型的 -->	
  		<!-- 这里的column对应的是User.hbm.xml里的set里面的key column 
  			告诉hibernate这个对象所对应的user的foreign key
  		-->
		<many-to-one name="user" class="com.lj.zhang.User" column="customer_id"></many-to-one>
  			
  	</class>
  
  
  </hibernate-mapping>
          
          
      
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
  "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
          
  <hibernate-mapping package="com.lj.zhang">
  	<class name="User" table="test_user">
  			<id name="id">
  				<generator class="native"/>
  			</id>
  			
  			<!-- length是用于定义数据库里面的字段的长度 -->
  			<property name="name" type="string" length="40" column="test_name"/>
  			 
  			  
  			
  			
  			<!-- 配置一对多关系要用到set节点 
  				name属性是User类中的属性名称
  				one-to-many里的class属性告诉了hibernate对应的类, 这样
  				才可以通过反射生成对象
  			-->
  			<set name="orders" cascade="save-update" inverse="true">    <!-- 级联, inverse=true表示由多的一方维持关联关系 -->
  				<!-- key的column告诉hibernate多的一方的foreign key -->
  				<!--  这里设置为customer_id, 就会在数据库的order表里生成相应的 -->
  				<key column="customer_id"></key>
  				<one-to-many class="com.lj.zhang.Order"/>
  			</set>
  			
  	</class>
  
  
  </hibernate-mapping>
          
          
      






源码笔记:
这里的final Type[] types里便是我们的Java对象类型。
org.hibernate.event.internal;

public class DefaultFlushEntityEventListener implements FlushEntityEventListener {
public void onFlushEntity(FlushEntityEvent event) throws HibernateException {
		final Object entity = event.getEntity();
		final EntityEntry entry = event.getEntityEntry();
		final EventSource session = event.getSession();
		final EntityPersister persister = entry.getPersister();
		final Status status = entry.getStatus();
		final Type[] types = persister.getPropertyTypes();

		final boolean mightBeDirty = entry.requiresDirtyCheck(entity);

		final Object[] values = getValues( entity, entry, mightBeDirty, session );





发表评论
用户名: 匿名