Hibernate 表关系描述之OneToMany
2010-01-07 16:01
651 查看
上篇写了一对一,那么在这篇我们讲一对多,那么在表中的一对多,是使用外键关联,通过一张表的一个键另一个表的外键来建立一多关系;
而在类中表示为一个类中有一个集合属性包含对方类的很多对象,而在另一个类中,只包含前术类的一个对象,从而实现一对多关系的建立!
而在Hibernate中采用的是Set类型集合,而使用<one-to-many>主<many-to-one>来实现,好了,我们来看一下:
首先看看表结构!
customer表:
create table customers
(
ID bigint not null primary key auto_increment,
userName varchar(20)
);
Order表:
create table orders
(
ID bigint not null primary key auto_increment,
customers_ID bigint, --应该为customers(ID)外键
orderDescription varchar(50)--订单描述
);
有了上面简单的客户表与订单表,来建立一个Project!~并且添加Hibernate~并由上面二张表生成Beans,主键都是native类型~自动递增!
我们将 自动生成的Customer.java Bean添加一个SET属性,代码如下:
package fengyan.Hibernate;
import java.util.HashSet;
import java.util.Set;
package fengyan.Hibernate;
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="fengyan.Hibernate.Customers" table="customers" catalog="study">
<id name="id" type="java.lang.Long">
<column name="ID" />
<generator class="native" />
</id>
<property name="userName" type="java.lang.String">
<column name="userName" length="20" />
</property>
<!-- name集合属性orders
table对应的表名
cascade 级联关系,当保存或更新时会级联保存与这个Customers对象相关联的所有Orders对象
inverse=true是将 控权抛出(给Orders) -->
<set name="orders" table="orders" cascade="save-update" inverse="true">
<key column="customers_ID"></key><!-- 表字段 -->
<one-to-many class="fengyan.Hibernate.Orders"/><!-- 关联的类 -->
</set>
</class>
</hibernate-mapping>
修改Order.hbm.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="fengyan.Hibernate.Orders" table="orders" catalog="study">
<id name="id" type="java.lang.Long">
<column name="ID" />
<generator class="native" />
</id>
<property name="orderDescription" type="java.lang.String">
<column name="orderDescription" length="50" />
</property>
<!-- name属性名
class对应的类
column对应的表字段 -->
<many-to-one name="customer" class="fengyan.Hibernate.Customers" column="customers_ID"></many-to-one>
</class>
</hibernate-mapping>
然后我们建立一个CustomersDAO操作类
package fengyan.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
package fengyan.Hibernate;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<br>
<a href="servlet/MyServlet">add</a>
</body>
</html>
运行效果如下:
//用户关联订单
customer.getOrders().add(order1);
customer.getOrders().add(order2);
不是已经由用户关联了订单吗?这是因为我们在Customers.hbm.xml的set节点中加了属性inverse=true,这句话的意思是将主控制权交出去,具体是什么意思呢?就是在一对多关系中将 主动权交出,具体也就是交给了Orders,也就是用户与订单之间从属关系主要是由Orders对象来确定,也即订单自己来决定它属于哪个对象,所以在这里,我们将 订单关联用户的代码注释掉后,虽然后面 用户关联了订单,但因为用户已经将主动权交出,所以Hibernate在帮我们save订单的时候并不知道订单是属于哪个用户,也自然就在Customers_ID字段填空值了!
那么如果此时我们将Customers.hbm.xml中的 inverse=true去掉是不是就行了呢?带着这样的猜想,我来尝试一下,结果如下图:
<!--
none:在保存,更新或删除当前对象时,忽略其他关联的对象。它是cascade属性的默认值
save-update:当通过Session的save()以及saveOrUpdate()方法来保存或更新当前对象时,级联保存所有关联的新建的临时对象,并且级联更新所有关联的游离对象。
delete:当通过Session的delete()方法删除当前对象时,级联删除所有关联的对象。
all: 包含save-update以及delete的行为。此外,对当前对象执行evict()或lock()操作时,也会对所有关联的持久化对象执行evict()或lock()操作。
delete-orphan:删除所有和当前对象解除关联关系的对象。
all-delete-orphan:包含all和delete-orphan的行为
-->
而在类中表示为一个类中有一个集合属性包含对方类的很多对象,而在另一个类中,只包含前术类的一个对象,从而实现一对多关系的建立!
而在Hibernate中采用的是Set类型集合,而使用<one-to-many>主<many-to-one>来实现,好了,我们来看一下:
首先看看表结构!
customer表:
create table customers
(
ID bigint not null primary key auto_increment,
userName varchar(20)
);
Order表:
create table orders
(
ID bigint not null primary key auto_increment,
customers_ID bigint, --应该为customers(ID)外键
orderDescription varchar(50)--订单描述
);
有了上面简单的客户表与订单表,来建立一个Project!~并且添加Hibernate~并由上面二张表生成Beans,主键都是native类型~自动递增!
我们将 自动生成的Customer.java Bean添加一个SET属性,代码如下:
package fengyan.Hibernate;
import java.util.HashSet;
import java.util.Set;
package fengyan.Hibernate;
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="fengyan.Hibernate.Customers" table="customers" catalog="study">
<id name="id" type="java.lang.Long">
<column name="ID" />
<generator class="native" />
</id>
<property name="userName" type="java.lang.String">
<column name="userName" length="20" />
</property>
<!-- name集合属性orders
table对应的表名
cascade 级联关系,当保存或更新时会级联保存与这个Customers对象相关联的所有Orders对象
inverse=true是将 控权抛出(给Orders) -->
<set name="orders" table="orders" cascade="save-update" inverse="true">
<key column="customers_ID"></key><!-- 表字段 -->
<one-to-many class="fengyan.Hibernate.Orders"/><!-- 关联的类 -->
</set>
</class>
</hibernate-mapping>
修改Order.hbm.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="fengyan.Hibernate.Orders" table="orders" catalog="study">
<id name="id" type="java.lang.Long">
<column name="ID" />
<generator class="native" />
</id>
<property name="orderDescription" type="java.lang.String">
<column name="orderDescription" length="50" />
</property>
<!-- name属性名
class对应的类
column对应的表字段 -->
<many-to-one name="customer" class="fengyan.Hibernate.Customers" column="customers_ID"></many-to-one>
</class>
</hibernate-mapping>
然后我们建立一个CustomersDAO操作类
package fengyan.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
package fengyan.Hibernate;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<br>
<a href="servlet/MyServlet">add</a>
</body>
</html>
运行效果如下:
//用户关联订单
customer.getOrders().add(order1);
customer.getOrders().add(order2);
不是已经由用户关联了订单吗?这是因为我们在Customers.hbm.xml的set节点中加了属性inverse=true,这句话的意思是将主控制权交出去,具体是什么意思呢?就是在一对多关系中将 主动权交出,具体也就是交给了Orders,也就是用户与订单之间从属关系主要是由Orders对象来确定,也即订单自己来决定它属于哪个对象,所以在这里,我们将 订单关联用户的代码注释掉后,虽然后面 用户关联了订单,但因为用户已经将主动权交出,所以Hibernate在帮我们save订单的时候并不知道订单是属于哪个用户,也自然就在Customers_ID字段填空值了!
那么如果此时我们将Customers.hbm.xml中的 inverse=true去掉是不是就行了呢?带着这样的猜想,我来尝试一下,结果如下图:
<!--
none:在保存,更新或删除当前对象时,忽略其他关联的对象。它是cascade属性的默认值
save-update:当通过Session的save()以及saveOrUpdate()方法来保存或更新当前对象时,级联保存所有关联的新建的临时对象,并且级联更新所有关联的游离对象。
delete:当通过Session的delete()方法删除当前对象时,级联删除所有关联的对象。
all: 包含save-update以及delete的行为。此外,对当前对象执行evict()或lock()操作时,也会对所有关联的持久化对象执行evict()或lock()操作。
delete-orphan:删除所有和当前对象解除关联关系的对象。
all-delete-orphan:包含all和delete-orphan的行为
-->
相关文章推荐
- Hibernate 表关系描述之OneToMany
- Hibernate 表关系描述之OneToMany
- Rhythmk 学习 Hibernate 05 - Hibernate 表间关系 [ManyToOne,OneToMany]
- Hibernate one-to-many && many-to-many 的关系映射
- Hibernate实体关系映射(OneToMany、ManyToOne双边)——完整实例
- Hibernate 、多表关联映射-多对一关系(many-to-one)
- Hibernate中many-to-one关系的编写
- Hibernate 表关系描述之OneToOne
- Hibernate 表关系描述之ManyToMany
- Hibernate映射关系解析(三)--Unidirectional associations--one-to-many
- Hibernate 表关系描述之ManyToMany
- Hibernate 、多表关联映射-多对一关系(many-to-one)
- Hibernate 、多表关联映射-多对一关系(many-to-one)
- Hibernate 、多表关联映射-多对一关系(many-to-one)
- Hibernate多对一关系代码示例(Many-To-One)
- Hibernate实体关系映射(OneToMany单边)——完整实例
- Hibernate使用property-ref属性解决遗留数据库One To Many关系的问题。
- Hibernate中many-to-one关系的编写
- Hibernate中many-to-one关系的编写
- Hibernate关系映射(四)一对多单向关联@OneToMany Annotation方式