写这篇文章主要是介绍一下hibernate关于一对多 多对一 多对多关联关系的设置。
看似三个问题解决起来实则是2个问题,因为多对一和一对多的处理是反向的。
下面我们先从一对多入手,对于一对多我们从两个方面讲解:
1)一对多单向关联关系
2)一对多双向关联关系
我们使用User和OrderItem来描述,一个user可以拥有多个订单,一个订单只能属于一个user
在调试这段代码的时候闹了一点小插曲,我一开始是使用order作为表名称的,打算直接让hibernate生成表结构,没想到hibernate.cfg.xml配置没有问题,ORM映射文件配置也没有问题,但就是报错,苦思冥想了一天还没有解决,晚上一看自己真是sb,order在mysql中是关键字,关键字啊~~!mb浪费我一天时间,还以为是什么nb的bug呢,希望大家也注意一下。
首先我们来敲两个实体类User 和OrderItem
public class User {
private Long uid;
private String username;
private String password;
//set,get方法就不粘了
}
’
public class OrderItem {
private Long oid;
private String name;
private User user;
}
然后配置ORM映射文件
user的映射文件和正常的一样,就不赘述了。
OrderItem的ORM映射文件
<?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="OrderItem" table="OrderItem">
<id name="oid">
<generator class="native"></generator>
</id>
<property name="name"></property>
<!-- name 该对象的属性名 class设置该属性的类型 column设置外键名称 -->
<many-to-one name="user" class="User" column="uid"></many-to-one>
</class>
</hibernate-mapping>
好了,单向关联就这么简单。
下面来说一下双向关联
双向关联关系只不过是在user中添加Set<OrderItem>属性,在ORM映射文件中配置一下即可,简单看一下代码就不在复杂的讲解了。
<!-- 见名知意我们就不许要解释了吧 -->
<set name="orders">
<key column="uid"></key>
<one-to-many class="OrderItem"/>
</set>
private Set<OrderItem> orders;
在hibernate中通过在set标签中添加inverse属性来决定是由双向关联关系的哪一方来维护表与表之间的关系,inverse=false为主动方(维护关系),inverse=true为被动方(不维护关系),默认为false,在多对一关系中,将n的一方设置为主动方有助于性能的改善。
下面说一下多对多关系的配置:
首先要想建立多对多关系的话,必须存在第三张表,来关联,我想这一点我就不用在阐述了吧,我记得我写的mysql中提到过,有兴趣的可以参看以下。
然后我们直接上手建立多对多关系:
1)两个javabean
public class Role {
private Long id;
private String name;
private Set<User> users;
//set,get方法省略
}
public class User {
private Long id;
private String name;
private Set<Role> roles;
}
ORM映射文件
<?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="User">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<!-- 必须有一方放弃关系的维护,因为我们创建的第三张表是以role_id和user_id为主键的,如果
双方都维护关系的话会重复插入相同的数据进而报错 -->
<set name="roles" inverse="true" table="user_role">
<key column="user_id"></key><!-- 在user_role表中的外键名 -->
<many-to-many class="Role" column="role_id"></many-to-many>
<!-- role在user_role表下的外建名 -->
</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="Role">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<set name="users" table="user_role">
<key column="role_id"></key>
<many-to-many class="User" column="user_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
哦了,就这麽简单就完事了。