Hibernate(5.3.7)的三种关联关系

版权声明:版权所有@万星明 https://blog.csdn.net/qq_19533277/article/details/84893660

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、一对一:

一对一就是最简单的普通操作,我就不写了。

猜你喜欢

转载自blog.csdn.net/qq_19533277/article/details/84893660