本例通过用户--》订单--》订单明细的实例来说明Hibernate中的关系映射,Hibernate中的关系和数据库中的关系没有什么关系。在Hibernate中使用config文件来配置映射关系,常见的关系有:one-to-one,many-to-one,set+one-to-many,set+many-to-many。
我们需要3张表:
drop table if exists my_user;
create table my_user(
user_id int primary key,
user_name varchar(20)
);
drop table if exists my_order;
create table my_order(
order_id int primary key,
user_id int,
time timestamp
);
drop table if exists my_order_item;
create table my_order_item(
item_id int primary key,
book_name varchar(20),
book_num int,
order_id int
);
先分析表与表的关系,用户对订单,属于一对多关系(set+one-to-many);订单对用户,属于多对一的关系(many-to-one);订单对订单明细,属于一对多关系(set+one-to-many);订单明细对订单,属于多对一关系(many-to-one)。
配置ORM文件:
在UserBean.hbm.xml中
注意:关于lazy参数,在关系映射中,为了提高性能,一般把关联的对象设置为延迟加载;
<set name="orders" table="my_order" lazy="true" inverse="false" cascade="all" sort="unsorted">
<key column="user_id"/>
<one-to-many class="beans.OrderBean"/>
</set>
在OrderBean.hbm.xml中
<!--
订单与用户:n:1 -->
<many-to-one name="user" class="beans.UserBean" column="user_id"/>
<!--
订单与订单明细:1:n -->
<set name="items"
table="my_order_item"
lazy="true"
inverse="false"
cascade="all"
sort="unsorted">
<key column="order_id"/>
<one-to-many class="beans.OrderItemBean"/>
</set>
在OrderItemBean.hbm.xml中
<many-to-one
name="order"
class="beans.OrderBean"
column="order_id"
/>
参数说明:
1、inverse:控制方的设置,在映射1:n的关系中,应该one方设置inverse为“false",在many方把inverse设置为"true",可以提高应用性能;
在建立两个对象的双向关联时,应该同时修改关联两端的对象的相应属性;
2、cascade:级联方式的设置,有4个选项none/all/save-update/delete:
none:是没有级联
all:是所有的操作都级联
save-update:是在进行save和update的时候级联
delete:就是在delete的时候级联
Demo.java
public static void main(String[] args) {
Session
session=HibernateSessionFactory.getSession();
Transaction ts=session.beginTransaction();
//创建user
UserBean user=new UserBean();
user.setUser_name("Tom");
//创建一个订单
OrderBean order=new OrderBean();
order.setTime(new java.sql.Timestamp(new java.util.Date().getTime()));
//创建订单明细
OrderItemBean items=new OrderItemBean();
items.setBook_name("JAVA");
items.setBook_num(new Integer(3));
//订单明细2
OrderItemBean items2=new OrderItemBean();
items2.setBook_name("C++");
items2.setBook_num(new Integer(6));
//设置相互关系
user.getOrders().add(order);
order.getItems().add(items);
order.getItems().add(items);
//双向关系
order.setUser(user);
items.setOrder(order);
items2.setOrder(order);
//入库
//由于用户和订单,订单和订单明细之间是级联关系,所以在添加用户时,把附属信息一并添加到数据库中
session.save(user);
ts.commit();
session.close();
System.out.println("数据已入库!");
}