`
kangsg219
  • 浏览: 121798 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

单向关联和双向关联

阅读更多
当使用单向关联时,由父类管理关联关系,子类无法管理,而这时,父亲知道自己的儿子,但是,从儿子对象不知道父亲是谁。
单向关联时,只指定<one-to-many>
当使用双向关联时,关联关系的管理可以通过inverse指定,这时,儿子能清楚的知道自己的父亲是谁。 双向关联时,还要指定<many-to-one>。
Cascade属性是来控制进行级联操作的。从父类这边,父亲知道自己的孩子是谁,可以进行级联操作,但从子类那边,它是不清楚自己的父亲是谁的,所以,不能进行级联操作的。

按常理来论,关联都应该是双向的,那么单向关联是什么呢?什么时候应该使用单向关联,么时候应该使用双向关联?
hibernate_reference:确实如此,hibernate 建议用双向关联。不过,既然存在,就有道理。省点事而已。比如,
user <--> city ;
class user{
city;
}
不需要
class city{
// List users; // this is unnecessary for business , 不需要 .
}
对象层不需要,persistance 层 当然不需要了。就省了吧。

两个类如下:::
public class Person {
private String id;
private String name;
private String email;
//对应的get/set方法
}


public class Author {
private String id;
private String alias;
private Person person;
//对应的get/set方法
}


<hibernate-mapping>
person.hbm.xml如下
<class name="com.hibernate.Person" table="person">
<id name="id" type="string">
<generator class="uuid.hex"/>
</id>

<property name="name"/>
<property name="email"/>
</class>
</hibernate-mapping>

author.hbm.xml如下:
<hibernate-mapping>
<class name="com.hibernate.Author" table="author">
<id name="id" column="id">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<property name="alias" type="string"/>
<one-to-one name="person" class="com.hibernate.Person" cascade="all" constrained="true"/>
</class>
</hibernate-mapping>




A. 首先我在MYSQL中建立USER的表:
CREATE TABLE USER (
USER_ID VARCHAR(10) NOT NULL PRIMARY KEY,
NAME VARCHAR(16) NOT NULL
);

建立ROOM表:
CREATE TABLE ROOM(
ROOM_ID VARCHAR(10)NOT NULL PRIMARY KEY,
ADDRESS VARCHAR(32) NOT NULL);

B. 建立每个表对应的实体:
首先是user表对应的实体
package com.po;
public class User {
private long id;
private String name;
private house room;

public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public house getRoom() {
return room;
}

public void setRoom(house room) {
this.room = room;
}
}

接着是ROOM表对应的实体:
Package com.po;
public class Room {
private long id;
private String address;
private person user;

public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public person getUser() {
return user;
}
public void setUser(person user) {
this.user = user;
}
}

C. 与之两个表对应的XML配置文件:
User的配置文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="com.po.User" table="USER">
<id name="id" column="USER_ID" unsaved-value="0">
<generator class="increment"/>
</id>
<property name="name">
<column name="NAME" length="16" not-null="true"/>
</property>
<one-to-one name="room" class="com.po.Room" cascade="all"/>
</class>
</hibernate-mapping>
Room的配置文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
1. "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="com.po..Room" table="ROOM">
<id name="id" column="ROOM_ID" unsaved-value="0">
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
<property name="address" type="string"/>
<one-to-one name="user"
class="com.po.User"
constrained="true"/>
</class>
</hibernate-mapping>

在这里注意一下,我们使用的是one to one 映射,一般One to One映射有两种实现的方式,一种是是通过外键参考,也就是在多对一的时候中可以限制为多对一为一对多,那个时候只要在<many-to- one>的many方加上unique=”true”就可以,具体的在以后讨论。在这里我们仅仅讨论One To One的那种情况,我们需要在Room的One To One的时候使用constrained="true",表示Room的主键参考User的主键。在这个地方,开始的时候我没有弄明白,后来参考了这些属性的解释说明才明白。大家可以看一下,Room的id要多了几个属性,现在我就每个属性说一下他的运用:
在<id></id>中 name: 标识属性的名字。Column:对应数据库中的列,unsaved-value: 默认为null, 一个特定的标识属性值,用来标志该实例是刚刚创建的,尚未保存。这可以把这种实例和从以前的session中装载过(可能又做过修改--译者注)但未再次持久化的实例区分开来。重要的是<generator></<generator>这个属性,class=” forgign”,表示使用另外一个相关联的对象的标识符。<param name="property">user</param>表示要关联的实体。
D. 测试往数据库中插入数据的程序:
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
public class HibernateTest {
public static void main(String[] args) throws HibernateException {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

Room room = new Room();
room.setAddress("NTU-M8-419");

User user1 = new User();
user1.setName("bush");

user1.setRoom(room);
room.setUser(user1);

Session session = sessionFactory.openSession();
Transaction tx= session.beginTransaction();
session.save(user1);

tx.commit();
session.close();

sessionFactory.close();
}
}
分享到:
评论

相关推荐

    hibernate 多对多全注解(单向关联、双向关联)

    hibernate关联映射注解多对多单向关联、

    hibernate多对多双向关联

    多对多双向关联 &lt;br&gt;注意映射规则: &lt;set name="roles" table="t_user_role"&gt;&lt;br&gt; &lt;key column="userid"/&gt;&lt;br&gt; &lt;many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/&gt;&lt;br&gt; &lt;/set&gt;&lt;br&gt; table...

    Hibernate关联关系映射目录

    单向关联 │ ├─ 一对一外键单向关联 │ ├─ 一对一主键单向关联 │ ├─ 一对一连接表单向关联 │ ├─ 一对多外键单向关联 │ ├─ 一对多连接表单向关联 │ ├─ 多对一外键单向关联 │ ├─ 多对一连接表单向...

    Hibernate关联映射

    Hibernate 一对一外键单向关联 Hibernate 一对一主键单向关联 Hibernate 一对一连接表单向关联 Hibernate 一对多外键单向关联 Hibernate 一对多连接表单向关联 Hibernate 多对一外键单向关联 Hibernate 多对一连接...

    hibernate关联映射详解

    包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。

    hibernate03:多对一单向关联、多对一双向关联

    NULL 博文链接:https://1601844782.iteye.com/blog/2276421

    hibernate one-to-one 一对一唯一外键关联映射_单向 and 双向

    hibernate one-to-one 一对一唯一外键关联映射_单向 and 双向

    关于图书馆文本

    Hibernate中管理的实体类的关联关系是通过包含来实现的,根据关联的2方是否相互包含分为单向关联和双向关联: Hibernate 配置实体关联不仅仅要在实体类中包含关联类,而且要在hbm映射文件中说明。

    Java的Hibernate框架中一对多的单向和双向关联映射

    建立对SQL语句的映射是Hibernate框架操作数据库的主要手段,这里我们列举实例来为大家讲解Java的Hibernate框架中一对多的单向和双向关联映射

    eshop1.0(ssh电子商城)

    8.配置会员到订单的一对多双向关联关系 9.配置会员到留言的一对多单向关联关系 10.配置管理员到留言的一对多单向关联关系 11.配置会员到购物车的一对多单向关联关系 12.配置订单到购物车的一对一单向关联关系 13....

    Hibernate_Annotation关联映射

    上面这个例子中,Trainer通过TrainedMonkeys表和Monkey建立了单向关联,其中外键trainer_id关联到Trainer(joinColoumn),而外键monkey_id关联到Monkey(inversejionColoumns) 默认处理机制: 通过联接表来建立单向一对...

    Hibernate学习笔记

    014 一对多关联映射 单向 015 一对多关联映射 双向 016 多对多关联映射 单向 017 多对多关联映射 双向 018 关联映射文件中标签中的 lazy(懒加载)属性 019 关联映射文件中集合标签中的 lazy(懒加载)属性 020 、单端...

    CH02-关联映射、缓存.pptx

    熟练使用JPA的关联映射 多对一,一对多单向 双向多对一关联 双向一对一关联 双向多对多关联 会使用JPA的二级缓存

    hibernate学习笔记

    hibernate一对一主键关联映射(单向关联Person----&gt;IdCard) 8 hibernate一对一主键关联映射(双向关联Person&lt;----&gt;IdCard) 9 hibernate一对一唯一外键关联映射(单向关联Person----&gt;IdCard) 10 hibernate一对一...

    NHibernate中文文档

    双向关联(Bidirectional Associations) 14 三重关联(Ternary Associations) 15 异类关联(Heterogeneous Associations) 15 集合例子 15 第6章 关联映射 15 简介 15 单向关联 15 使用表连接的单向关联 16 双向关联 16 ...

    精通Java Web整合开发(第2版)

    12.4.5 多对一单向关联的annotation注解实现538 12.4.6 一对多双向关联的annotation注解实现540 12.4.7 一对多双向自身关联的annotation注解实现542 12.4.8 多对多单向关联的annotation注解实现543 12.4.9 多对多...

    青鸟租房系统关联映射

    对象间的关联分为一对多,多对一,多对多等几种情况,关联是有方向的,可以是双向的关联也可以是单向的关联。

    JPA-4 映射关联关系

    映射单向多对一、单向一对多、双向一对一、双向多对一和双向多对多关联关系的具体实现

    Hibernate_实体关联关系映射--学习总结

    Hibernate 实体关联关系映射 学习总结 把一对一 一对多 单向 双向 主键 外键 链接表等讲的比较清楚

Global site tag (gtag.js) - Google Analytics