一对多:
一:主表,多:从表
主表里有主键,从表里是外键
一:
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 : 三个整合