hibernate的单向多对一和一对多在理解上是一回事,最终达到的效果也一样,但在编码和配置中可不一样啊。
该问题属于多表关联的范畴,以下简称一的那端就叫一,多的那端就叫多。
1】多对一
package com.many2one_uni.entity;
/**
* 多的一方
*/
public class Student {
private int stuId;
private String stuName;
private Teacher teacher;
<pre name="code" class="java"><span style="white-space:pre"> </span>//get set 方法 此处省略
}
该实体类对应的配置文件
<?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 package="com.many2one_uni.entity">
<class name="Student" table="tb_student">
<id name="stuId" column="stu_id">
<type name="java.lang.Integer" />
<generator class="native"/>
</id>
<property name="stuName" column="stu_name">
<type name="java.lang.String"></type>
</property>
<span style="color:#ff0000;"><many-to-one name="teacher" column="teaId"/></span>
</class>
</hibernate-mapping>
写测试代码,运行后,表结构如下:
User表(多)
Teacher表(一)
2】一对多
package com.one2many_uni.entity;
import java.util.HashSet;
import java.util.Set;
<pre name="code" class="java">/**
* 一的一方
*/
public class Group {private int GId;private String GName;
private Set<User> users = new HashSet<User>();//get set 方法 此处省略}
该实体类对应的配置文件
<?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 package="com.one2many_uni.entity">
<class name="Group" table="tb_group">
<id name="GId" column="g_id" length="32">
<type name="java.lang.Integer" />
<generator class="native"/>
</id>
<property name="GName" column="g_name" length="50">
<type name="java.lang.String"></type>
</property>
<span style="color:#ff0000;"><set name="users" >
<key column="GId"></key>
<one-to-many class="User"/>
</set></span>
</class>
</hibernate-mapping>
写测试代码,运行后,表结构如下:
Group表(一)
User表(多)
3】可见不管关联关系在哪一方声明,结果被关联字段都是在多的一方形成的表中。
4】最后说明一下
<span style="color:#ff0000;"><span style="white-space:pre"> </span><set name="users" >
<span style="white-space:pre"> </span><key column="GId"></key>
<one-to-many class="User"/>
</set></span>
该配置中的set和java类中的set指的不是一回事。详细解读可参见http://blog.csdn.net/ajun_studio/article/details/6438124中
集合类型的延迟加载。