Hibernate 关系映射
2010-03-26 14:46
302 查看
现实生活中有很多1对多(多对1)的关系模型。比如,一个人可以有0到多套房子,0到多辆汽车;一个父亲有0到多个孩子等等。这种关系被称作1对多
关系。反过来,房子与人,汽车与人的关系,以及孩子与父亲的关系就是多对一的关系。这里需要注意一点的是,多对一关系的一个前提是:一套确定的房子只能属
于某个确定的人(不能属于多人);一个确定的孩子也只能属于某个确定的父亲。
下面我们就拿最简单的父亲和孩子的关系来说明1对多(多对1)模型在Hibernate
中的映射。
关系模型:父亲 vs 孩子(Father vs Son)。
Hibernate
中对应的关系映射:one-to-many
反过来,
关系模型:孩子 vs 父亲(Son vs Father)。
Hibernate
中对应的关系映射:many-to-one
很多初学者往往有这样的疑问,我什么时候需要定义映射关系呢?
答案很简单:按需求来确定。就是说你需要哪种关系的时候就定义哪种映射,不需要的时候就可以不定义它们的关系映射了。还是以上面的例子来说明。
如果你需要在取得孩子(Son)的时候,同时需要知道该孩子的父亲(Father)是谁,你就可以在孩子的映射定义文件Son.hbm.xml里定义孩子跟父亲的关系映射:many-to-one。
同样,如果需要知道某父亲的所有孩子,就可以在父亲的映射定义文件Father.hbm.xml里定义父亲跟孩子的关系映射:one-to-many。
回到正题,怎么定义呢?下面我们列出代码:
TABLE-CREATE SQL:
#
# father TABLE
#
CREATE TABLE FATHER (
ID CHAR(32) NOT NULL,
NAME CHAR(32) NOT NULL,
PRIMARY KEY(id)
)
#
# SON TABLE
#
CREATE TABLE SON (
ID CHAR(32) NOT NULL,
NAME CHAR(32) NOT NULL,
FATHER_ID CHAR(32) NOT NULL,
PRIMARY KEY(id)
)
# ALTER TABLE SON ADD FOREIGN KEY FATHER_ID REFERENCE FATHER(ID);
Hibernate
代码:
Father.hbm.xml
--
<!-- FAHTER vs SON -->
<set name="sonSet
" lazy="true
" inverse="true
">
<key>
<column name="FATHER_ID
" not-null="true
" />
</key>
<one-to-many class="com.yourcompany.entity.Son
" />
</set>
Father.java
--
/** sonSet: association with set */
private
java.util.Set sonSet;
…
/**
* set sonSet
* @param
sonSet association with set
*/
public
void
setSonSet(java.util.Set sonSet) {
this.sonSet = sonSet;
}
/**
* get sonSet
* @return
sonSet
*/
public
java.util.Set getSonSet() {
return
sonSet;
}
Son.hbm.xml
<!-- SON vs FATHER -->
<many-to-one
column="FATHER_ID
"
name="father
"
class="com.yourcompany.entity.Father
"
not-null="true
"
cascade="none
" />
Son.java
/** father: many-to-one association */
private
com.yourcompany.entity.Father father;
…
/**
* set father
* @param
father many-to-one association
*/
public
void
setFather(com.yourcompany.entity.Father father) {
this.father = father;
}
/**
* get father
* @return
father
*/
public
com.yourcompany.entity.Father getFather() {
return
father;
}
另一个比较详细的讲解: http://lavasoft.blog.51cto.com/62575/39398
关系。反过来,房子与人,汽车与人的关系,以及孩子与父亲的关系就是多对一的关系。这里需要注意一点的是,多对一关系的一个前提是:一套确定的房子只能属
于某个确定的人(不能属于多人);一个确定的孩子也只能属于某个确定的父亲。
下面我们就拿最简单的父亲和孩子的关系来说明1对多(多对1)模型在Hibernate
中的映射。
关系模型:父亲 vs 孩子(Father vs Son)。
Hibernate
中对应的关系映射:one-to-many
反过来,
关系模型:孩子 vs 父亲(Son vs Father)。
Hibernate
中对应的关系映射:many-to-one
很多初学者往往有这样的疑问,我什么时候需要定义映射关系呢?
答案很简单:按需求来确定。就是说你需要哪种关系的时候就定义哪种映射,不需要的时候就可以不定义它们的关系映射了。还是以上面的例子来说明。
如果你需要在取得孩子(Son)的时候,同时需要知道该孩子的父亲(Father)是谁,你就可以在孩子的映射定义文件Son.hbm.xml里定义孩子跟父亲的关系映射:many-to-one。
同样,如果需要知道某父亲的所有孩子,就可以在父亲的映射定义文件Father.hbm.xml里定义父亲跟孩子的关系映射:one-to-many。
回到正题,怎么定义呢?下面我们列出代码:
TABLE-CREATE SQL:
#
# father TABLE
#
CREATE TABLE FATHER (
ID CHAR(32) NOT NULL,
NAME CHAR(32) NOT NULL,
PRIMARY KEY(id)
)
#
# SON TABLE
#
CREATE TABLE SON (
ID CHAR(32) NOT NULL,
NAME CHAR(32) NOT NULL,
FATHER_ID CHAR(32) NOT NULL,
PRIMARY KEY(id)
)
# ALTER TABLE SON ADD FOREIGN KEY FATHER_ID REFERENCE FATHER(ID);
Hibernate
代码:
Father.hbm.xml
--
<!-- FAHTER vs SON -->
<set name="sonSet
" lazy="true
" inverse="true
">
<key>
<column name="FATHER_ID
" not-null="true
" />
</key>
<one-to-many class="com.yourcompany.entity.Son
" />
</set>
Father.java
--
/** sonSet: association with set */
private
java.util.Set sonSet;
…
/**
* set sonSet
* @param
sonSet association with set
*/
public
void
setSonSet(java.util.Set sonSet) {
this.sonSet = sonSet;
}
/**
* get sonSet
* @return
sonSet
*/
public
java.util.Set getSonSet() {
return
sonSet;
}
Son.hbm.xml
<!-- SON vs FATHER -->
<many-to-one
column="FATHER_ID
"
name="father
"
class="com.yourcompany.entity.Father
"
not-null="true
"
cascade="none
" />
Son.java
/** father: many-to-one association */
private
com.yourcompany.entity.Father father;
…
/**
* set father
* @param
father many-to-one association
*/
public
void
setFather(com.yourcompany.entity.Father father) {
this.father = father;
}
/**
* get father
* @return
father
*/
public
com.yourcompany.entity.Father getFather() {
return
father;
}
另一个比较详细的讲解: http://lavasoft.blog.51cto.com/62575/39398
相关文章推荐
- Java类型、Hibernate映射类型和SQL类型之间的对应关系
- Hibernate的映射关系与级联(一对一、一对多、多对多)
- Hibernate关系映射(4)_一对一双向主键关联
- Hibernate关系映射(10)_多对多单向关联
- Hibernate入门之关系篇:一对一映射
- Hibernate之关系对象映射详解
- Hibernate入门之关系篇:多对一和一对多映射
- Hibernate(四)---映射关系
- Hibernate关系映射--单向一对一@OneToOne
- hibernate annotation注解方式来处理映射关系
- hibernate关系映射--单向多对多@ManyToMany
- (经典)Hibernate多对一关系映射(四)
- hibernate关系映射管理(一对多,多对一,一对一,多对多)
- 攻城狮在路上(壹) Hibernate(八)--- 映射Hibernate组成关系
- Hibernate执行流程和关系映射
- Hibernate关系映射----单向一对多实例
- Hibernate表关系映射之一对一映射
- 【hibernate框架】关系映射之一对一单项外键关联(Annotation实现)
- Hibernate进阶之单向多对一关系映射
- Hibernate进阶之映射集合关系