Hibernate关联关系之多对一

域对象关系:

1.关联:类之间引用关系,以属性声明的方式体现。

2.依赖:类之间访问关系,A类中的某个方法new B(),或者A类中的某个方法new B().getXxx()形式出现。但是类B不是类A的属性。

3.聚集:指的是整体与部分的关系:如人和手的关系,部分类不能脱离整体类单独存在。

4.一般化:泛化。继承。


1、多对一关系:(多个订单对应一个客户)

Order类

public class Order {
	private Integer id;
	private String orderNumber;
	private float price;
	/* 建立从Order到Customer之间多对一关联关系 */
	private Customer customer ;
}


Order.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.xxc.domain.Order" table="Orders" lazy="false">
		<id name="id" column="id" type="integer">
			<generator class="native"></generator>
		</id>
		<property name="orderNumber" column="orderNumber" type="string" length="20"/>
		<property name="price" column="price" type="float"/>
		<!-- 映射从Order到Customer之间多对一关联关系 -->
		<many-to-one name="customer" class="com.xxc.domain.Customer" column="cid"/>
	</class>
</hibernate-mapping>


Customer类

public class Customer {
	private Integer id;
	private String fname ;
	private String lname ;
	private Integer age;
	private Date birthday;
	private boolean married;
	private byte[] photo;
	private String description;
}

Customer.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.xxc.domain.Customer" table="Customers" lazy="false">
		<id name="id" column="id" type="integer">
			<generator class="native"></generator>
		</id>
		<property name="name" column="name" type="string" length="20" access="property"/>
		<property name="birthday" column="birthday" type="date"/>
		<property name="age" column="age" type="integer" length="20"/>
		<property name="description" column="description" type="text" />
		<property name="married">
			<column name="married" sql-type="int(20)"></column>
		</property>
		<property name="photo">
			 <!-- 当要手动设置数据库类型的时候可以用到此元素  property表的column属性和子元素column是互斥的,只能用其一 -->
			<column name="photo" sql-type="longblob"></column>
		</property>
	</class>
</hibernate-mapping>



测试类:

package com.xxc.app;

import java.sql.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.BeforeClass;
import org.junit.Test;

import com.xxc.domain.Customer;
import com.xxc.domain.Order;

public class App {
	private static SessionFactory sf = null;
	
	@BeforeClass
	public static void initialize(){
		Configuration config = new Configuration();
		/*  也可以写成这样的形式  方法链编程
		 *	sf = config.addClass(Customer.class).addClass(Order.class).buildSessionFactory();
		 */
		
		config.addClass(Customer.class);
		config.addClass(Order.class);
		sf = config.buildSessionFactory();
		
	}
	
	@Test
	public void insertCustomer(){
		Customer c = new Customer();
		c.setFname("x");
		c.setLname("x1122c");
		c.setBirthday(Date.valueOf("2012-12-21"));
		c.setMarried(false);
		c.setDescription("^^^^^^^^^^^^^^^");
		c.setAge(10);
		
		Order o = new Order();
		o.setOrderNumber("2");
		o.setPrice(199);
		//设置订单和客户的关联关系
		o.setCustomer(c);
		
		Session session = sf.openSession();
		Transaction t = session.beginTransaction();
		//如果在<many-to-one>标签中设置了cascade="save-update"  那么这里即使不保存customer对象,hibernate也会进行级联保存的
		//session.save(c);
		session.save(o);
		t.commit();
		session.close();
	}
}



注意:

当Hibernate持久化一个临时对象时,在默认情况下,它不会自动持久化所关联的其他临时对象,所以会抛出TransientObjectException异常。如果希望当Hibernate持久化Order对象时自动持久化所关联的Customer对象,可以把<many-to-one>的cascade属性设为"save-update",cascade属性的默认值为"none"。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值