many to many 双向

本文介绍使用Hibernate实现多对多关系的映射方法,包括XML配置文件定义及Java代码实现过程。通过实例展示了如何保存和加载具有多对多关联的数据。
<?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="com.yelang.hibernate.User" table="t_user">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="roles" table="t_user_role">
			<key column="userid"/>
			<many-to-many class="com.yelang.hibernate.Role" column="roleid"/>
		</set>
	</class>
</hibernate-mapping>

 

<?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="com.yelang.hibernate.Role" table="t_role">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="users" table="t_user_role" order-by="userid">
			<key column="roleid"/>
			<many-to-many class="com.yelang.hibernate.User" column="userid"/>
		</set>
	</class>
</hibernate-mapping>

 

 

package com.yelang.hibernate;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.hibernate.Session;

import junit.framework.TestCase;

public class Many2Many extends TestCase {

	public void testSave2() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Role r1 = new Role();
			r1.setName("数据录入人员");
			session.save(r1);
			
			Role r2 = new Role();
			r2.setName("商务主管");
			session.save(r2);
			
			Role r3 = new Role();
			r3.setName("大区经理");
			session.save(r3);
			
			User u1 = new User();
			u1.setName("10");
			Set u1Roles = new HashSet();
			u1Roles.add(r1);
			u1Roles.add(r2);
			u1.setRoles(u1Roles);
			
			User u2 = new User();
			u2.setName("祖儿");
			Set u2Roles = new HashSet();
			u2Roles.add(r2);
			u2Roles.add(r3);
			u2.setRoles(u2Roles);
			
			User u3 = new User();
			u3.setName("杰伦");
			Set u3Roles = new HashSet();
			u3Roles.add(r1);
			u3Roles.add(r2);
			u3Roles.add(r3);
			u3.setRoles(u3Roles);
			
			session.save(u1);
			session.save(u2);
			session.save(u3);
			
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}		
	
	public void testLoad1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			User user = (User)session.load(User.class, 1);
			System.out.println(user.getName());
			for (Iterator iter=user.getRoles().iterator(); iter.hasNext();) {
				Role role = (Role)iter.next();
				System.out.println(role.getName());
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}		
	
	public void testLoad2() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			Role role = (Role)session.load(Role.class, 1);
			System.out.println(role.getName());
			for (Iterator iter=role.getUsers().iterator(); iter.hasNext();) {
				User user = (User)iter.next();
				System.out.println(user.getName());
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}		
	
}

 

Hibernate 中,`many-to-one` 关系用于表示数据库中两个实体之间的多对一关联。例如,多个订单(Order)可以属于一个客户(Customer)。在这种情况下,`Order` 类将包含一个指向 `Customer` 的引用,而 `Customer` 类将包含一个 `Order` 的集合。这种关系是双向的,但在 Hibernate 中,通常建议只在关系的“所有者”一方维护这种关系。 ### Many-to-One 关系示例 假设我们有两个实体:`Customer` 和 `Order`。每个 `Order` 都关联到一个 `Customer`,而一个 `Customer` 可以有多个 `Order`。 #### 实体类定义 ```java // Customer.java public class Customer { private int id; private String name; private Set<Order> orders = new HashSet<>(); // Getters and Setters } // Order.java public class Order { private int id; private String details; private Customer customer; // Getters and Setters } ``` #### Hibernate 映射文件 在 HibernateXML 映射文件中,我们需要定义 `many-to-one` 关系。在这个例子中,`Order` 是关系的所有者,因为它包含了指向 `Customer` 的外键。 ```xml <!-- Customer.hbm.xml --> <hibernate-mapping> <class name="Customer" table="customer"> <id name="id" column="id"> <generator class="native"/> </id> <property name="name" column="name"/> <!-- 由于 Customer 是关系的反方,我们使用 inverse="true" --> <set name="orders" inverse="true"> <key column="customer_id"/> <one-to-many class="Order"/> </set> </class> </hibernate-mapping> <!-- Order.hbm.xml --> <hibernate-mapping> <class name="Order" table="order"> <id name="id" column="id"> <generator class="native"/> </id> <property name="details" column="details"/> <!-- many-to-one 关系定义 --> <many-to-one name="customer" class="Customer" column="customer_id" not-null="true"/> </class> </hibernate-mapping> ``` 在 `Customer` 的映射文件中,`<set>` 元素中的 `inverse="true"` 表示 `Customer` 不负责维护关系,而是由 `Order` 来维护。这意味着当我们保存 `Customer` 时,Hibernate 不会自动更新 `Order` 表中的外键。 ### 使用示例 当创建一个新的 `Order` 并将其关联到一个 `Customer` 时,代码可能如下所示: ```java Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); Customer customer = new Customer(); customer.setName("John Doe"); Order order = new Order(); order.setDetails("Order Details"); order.setCustomer(customer); // 设置关系 session.save(customer); session.save(order); tx.commit(); session.close(); ``` 在这个例子中,`Order` 对象通过 `setCustomer` 方法与 `Customer` 建立了关联。由于 `Order` 是关系的所有者,因此保存 `Order` 时,Hibernate 会正确地更新外键。 ### 总结 在 Hibernate 中,`many-to-one` 关系是通过在实体类中添加对另一个实体的引用,并在映射文件中使用 `<many-to-one>` 元素来定义的。为了确保数据的一致性和避免重复的更新操作,应该明确指定哪一方是关系的所有者。通常情况下,拥有外键的那一方应该是关系的所有者。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值