一对多:
一:主表,多:从表
主表里有主键,从表里是外键
一:
public class Customer {
private Integer id;
private String name;
private Set<Order> orders = new HashSet<Order>();
多:
public class Order {
private Integer id;
private String name;
private Customer customer;
配置:
<?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="domain">
<class name="Customer" table="t_customer">
<id name = "id" column="id">
<generator class="native"></generator>
</id>
<property name="name" column="name"></property>
<!-- 表达一对多关系的集合
name:集合的属性名称
-->
<set name="orders" inverse="false">
<!-- key:用来描述外键
column:外键的值
-->
<key column="cid"></key>
<!-- 表达 Customer与Order的关系是一对多
class:表达关联的另一方的完整类名
-->
<one-to-many class="Order" />
</set>
</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="domain">
<class name="Order" table="t_order">
<id name = "id" column="id">
<generator class="native"></generator>
</id>
<property name="name" column="name"></property>
<!-- 表达多对一关系
name:引用的属性名称
column:外键的列名
-->
<many-to-one name="customer" column="cid" class="Customer"></many-to-one>
</class>
</hibernate-mapping>
测试:
@Test
/**
* 增
*/
public void fun1() {
//1.读取配置文件
Configuration con = new Configuration().configure();
//2.根据配置创建factory
SessionFactory sf = con.buildSessionFactory();
//3.通过factory获取操作数据库的session对象
Session session = sf.openSession();
Transaction transaction = session.beginTransaction();
//4.操作数据库
Customer c=new Customer();
c.setName("zhangsan");
Order o1=new Order();
o1.setName("123");
Order o2=new Order();
o2.setName("456");
o1.setCustomer(c);
o2.setCustomer(c);
session.save(c);
session.save(o1);
session.save(o2);
transaction.commit();
//5.关闭资源
session.close();
sf.close();
}
主表的set标签里 有一个inverse属性,默认值为false.
意思是 反转, 是否将关系的维护反转给对方.
设为true代表,在Customer中放弃维护外键关系
<set name="orders" inverse="false">
<!-- key:用来描述外键
column:外键的值
-->
<key column="cid"></key>
<!-- 表达 Customer与Order的关系是一对多
class:表达关联的另一方的完整类名
-->
<one-to-many class="Order" />
</set>
什么时候配置inverse呢?
只要看业务,如果1的一方经常需要维护外键,那么在1的一方不要配置inverse属性
set标签里还有一个cascade属性
cascade:级联操作:
save-update:A保存,同时保存B
delete:删除A,同时删除B,AB都不存在
delete-orphan:孤儿删除,解除关系,同时将B删除,A存在的。
如果需要配置多项,使用逗号分隔。<set cascade="save-update,delete">
all : save-update 和 delete 整合
all-delete-orphan : 三个整合