欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

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

更新时间: 2014-01-05 02:01:09 责任编辑: Author_N1

 

一对多映射配置文件hbm.xml以及级联
有两个类, 一个是User, 一个是Order
一个User可以包含多个Order对象。

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来维持这个关系。

cascade表示当User进行何种操作的时候, 会关系到对应的set对象。
这里设置的是"save-update",也就是当添加user的时候, 与user对象对应的,
也就是user对象所包含的order对象也会被加入到数据库中, 并与该user对象关联。

但是如果设置成none, 那不管user.setOrder()这里设置进去多少order, 最后都
不会被存入数据库。 被存入数据库的最终就只有user自己。
==============级联==========



<?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 );





上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:01:09
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/4562/
本文WWW.DOC100.NET DOC100.NET版权所有。