Hibernate关联关系之多对一

来源:互联网 发布:毕业生贷款分期软件 编辑:程序博客网 时间:2024/05/16 11:49

域对象关系:

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;@BeforeClasspublic 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();}@Testpublic 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"。