HIbernate_一对多

一对多:

一:主表,多:从表
主表里有主键,从表里是外键
一:
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-updateA保存,同时保存B

delete:删除A,同时删除BAB都不存在

delete-orphan:孤儿删除,解除关系,同时将B删除,A存在的。

如果需要配置多项,使用逗号分隔。<set cascade="save-update,delete">

all : save-update delete 整合

all-delete-orphan : 三个整合






猜你喜欢

转载自blog.csdn.net/dear_mango/article/details/78194682