<级联关系>
代码:
Test.class;
package qau.edu.ren;
import java.util.Date;
import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration;
public class Test {
public static void main(String[] args) {
// 获取Session;
Session session = HibernateUtils.getSession();
// 开启事务;
Transaction tr = HibernateUtils.openTransaction();
Customer customer = new Customer();
customer.setName("BB");
Order o1 = new Order(); Order o2 = new Order();
o1.setName("aa"); o1.setDate(new Date());
o2.setName("bb"); o2.setDate(new Date());
// Order关联Customer时候才能使inverse属性有效,因为这个时候,关联关系的由Order // 也就是n的一方进行维护,所以没有上面的关联,是不会在Order表中插入外键的数值的。 o1.setCus(customer); o2.setCus(customer);
// 实现Customer到Order的关联(实现1到n的关联)
customer.getOrders().add(o2); customer.getOrders().add(o1); // // session.save(customer); // session.save(o2); // session.save(o1);
// //
// Customer cus = (Customer)session.get(Customer.class, 1); // // Set<Order> orders = cus.getOrders();
tr.commit();
session.close();
}
} |
总结:
当把保存Order的代码注释掉之后,执行后,只是在Customer数据表中插入了相应的数据,在Order中是没有任何数据的。
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 package="qau.edu.ren">
<class name="Customer" table="t_customer">
<id name="id" column="c_id"> <generator class="native"></generator> </id>
<property name="name" column="c_name"/>
<set name="orders" table="t_order" inverse="true" cascade="save-update">
<key column="c_id"/> <one-to-many class="Order"/>
</set> </class> </hibernate-mapping>
|
上面的代码中在<set>中加入“cascade="save-update"”指的是:在1-n关联关系中,当主动方进行保存和更新操作的时候,也需要被动方进行相应的操作,实现级联功能。这样更正之后,进行test测试之后,会在Order和Customer表中插入相应的数据。