域对象关系:
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"。