1、一对多(双向关联)
双向关联较为耗费资源,因此在实际开发中,使用单向关联(在下文代码中有注释)即可。
多的一方的POJO类需要有私有化的一的一方的实例即:
//多对一客户类属性
private Customer customer;
一的一方的POJO类需要有私有化的多的一方的Set集合:
//一对多订单集合
private Set<Order> orderSet = new HashSet<Order>();
多的一方(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="wan.bean.Order" table="orders">
<id name="id" type="int">
<column name="id" />
<generator class="native" />
</id>
<property name="amount" type="double">
<column name="amount" />
</property>
<property name="address" type="string">
<column name="address" />
</property>
<many-to-one name="customer" class="wan.bean.Customer" fetch="join">
<column name="customer_id" />
</many-to-one>
</class>
</hibernate-mapping>
一的一方(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="wan.bean.Customer" table="customer">
<id name="id" type="int">
<column name="id" />
<generator class="native" />
</id>
<property name="name" type="string">
<column name="name" />
</property>
<set name="orderSet" table="orders" inverse="false">
<!-- 外键 -->
<key>
<column name="customer_id"/>
</key>
<one-to-many class="wan.bean.Order" />
</set>
</class>
</hibernate-mapping>
测试:
@Test
public void testAdd2() {
//获得session对象
Session session = getSession();
//通过session开启事务
Transaction trans = session.beginTransaction();
//创建一个客户对象
Customer customer = new Customer();
customer.setName("马云");
//创建两个订单
Order order1 = new Order(1000,"硅谷");
Order order2 = new Order(2000, "大学城");
//将订单加入到客户对象中,建立联系
//customer.getOrderSet().add(order1);(注释之后,便是单向关联)
//customer.getOrderSet().add(order2);(注释之后,便是单向关联)
//当关系由多的一方维护时,需要添加以下的关系
order1.setCustomer(customer);
order2.setCustomer(customer);
//直接保存客户
session.save(customer);
session.save(order1);
session.save(order2);
//提交事务
trans.commit();
}
2、多对多(单向关联)
一方的POJO类需要有私有化另一方的集合即:
//多对多的老师集合,在Class类中
private Set<Teacher> teacherSet = new HashSet<Teacher>();
//多对多的班级集合,在Teacher类中
private Set<Classes> classesSet = new HashSet<Classes>();
(Class)的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="wan.bean">
<class name="Classes" table="classes">
<id name="id" type="int">
<column name="id" />
<generator class="native" />
</id>
<property name="cname" />
<!-- 外键,对应得表为中间表,对应键为c_id -->
<set name="teacherSet" table="classes_teacher" >
<key>
<column name="c_id"/>
</key>
<!-- 多对多对应Teacher POJO类,该类对应中间表的t_id -->
<many-to-many class="Teacher" column="t_id"/>
</set>
</class>
</hibernate-mapping>
(Teacher)的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="wan.bean">
<class name="Teacher" table="teacher">
<id name="id" type="int">
<column name="id" />
<generator class="native" />
</id>
<property name="name"/>
<!-- 外键,对应得表为中间表,对应键为t_id -->
<set name="classesSet" table="classes_teacher">
<key>
<column name="t_id" />
</key>
<!-- 多对多对应Classes POJO类,该类对应中间表的c_id -->
<many-to-many class="Classes" column="c_id"/>
</set>
</class>
</hibernate-mapping>
3、一对一:
一对一就是最简单的普通操作,我就不写了。