对象之间的关系:

关系映射之间的关系只的是对象之间的关系,并不指数据库表的关系(外键关系)这儿解决的问题是当对象之间的关系之一时,数据库表该如何映射,编程上如何对待。

一对一(主键关联,和单向的外键关联)

①单向(主键,外键)Husband和Wife表,a,主键关联 b,外键关联(wife为parent) ,c,主键关联 d,外键关联(husband为parent)

一对一单向外键关联:

annotation:@oneToOne  @JoinColumn(name="wifeId")

                    xml :    <many-to-one  unique="true"/>
一对一单向主键关联:annotation:@PrimaryKeyJoinColumn(name="id",referencedColumnName="id")
                    xml: <one-to-one name="stu" constrained="true"/>

②双向(主键,外键)

一对一双向外键关联:

annotation:在husband类中:@oneToOne

在wife类中:@OneToOne(mappedBy="wife")对方为主导,对于一对一双向外键关联必须写mappedBy

xml : <many-to-one name="stu" unique="true" column="stuid" not-null="true"/>

<one-to-one name="idCard

property-ref="stu"></one-to-one>

<generator class="foreign">

<param name="property">stu</param>

</generator>

一对一双向主键关联:

annotation:

@OneToOne

@PrimaryKeyJoinColumn(name="id",referencedColumnName="id")

@OneToOne(mappedBy="wife")

@PrimaryKeyJoinColumn(name="id",columnDefinition="id")

a ,Husband的id与wife的id相互关联  b,husband的外键wifeid和wife中husbandid

联合主键关联(不重要):

Annotation:

@OneToOne

@JoinColumns(

{

@JoinColumn(name="wifid",referencedColumnName="id"),

@JoinColumn(name="wifename",referencedColumnName="name")

}

)

中间表 建立一张中间表

一对多

①单向:

annotation:在一的一方加集合(Set),这种处理方式,hibernate把它当做了多对多关系处理,在数据库中建立了一张关系表。

@OneToMany

@JoinColumn(name="groupid")

public Set<User> getUsers() {

return users;

}

public void setUsers(Set<User> users) {

this.users = users;

}

Xml:

<set name="users">

<key column="groupid"></key>

<one-to-many class="User"/>

</set>

②双向(多对一的双向关联,一对多的双向关联是一样的)

多对一:

①单向(manytoone的单向关联):在多的一方加外键。1NF,要有主键,列不可分;2NF联合主键不能存在部分依赖3NF不能存在传递依赖。设计原则:不能产生冗余。

annotation:@ManyToOne

xml:<many-to-one name="g" column="groupid"></many-to-one>

②双向:(多对一的双向关联,一对多的双向关联是一样的)

Annotation:@ManyToOne

xml:

<set name="aliases" table="person_aliases" order-by="lower(name) asc">
    <key column="person"/>
    <element column="name" type="string"/>
</set>

多对多

①单向

annotation: @ManyToMany

xml :

<class name="Person">

<id name="id" column="personId">

<generator class="native"/>

</id>

<set name="addresses" table="PersonAddress">

<key column="personId"/>

<many-to-many column="addressId"

class="Address"/>

</set>

</class>

<class name="Address">

<id name="id" column="addressId">

<generator class="native"/>

</id>

</class>

②双向:

Annotation:

/**

*ManyToMany指明多对多关系

*JoinTable生成中间表,name指定中间表的名字,joinColumns

*指定参考这张表的主键的中间表的属性名,inverseJoinColumns

*指定参考相关表的主键的中间表的属性名。

*

*/

@ManyToMany

@JoinTable(name="t_t",joinColumns={

@JoinColumn(name="t_id")

},inverseJoinColumns={@JoinColumn(name="s_id")})

@ManyToMany(mappedBy="students")

Xml:

<?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.xie.hibernate.modal" >

<class name="Teacher" table="t_teacher">

<id name="id" column="id">

<generator class="native"></generator>

</id>

<property name="name" column="name"></property>

<set name="students" table="t_s">

<key column="t_id"></key>

<many-to-many column="s_id" class="Student"/>

</set>

</class>

</hibernate-mapping>

<?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.xie.hibernate.modal" >

<class name="Student" table="t_student">

<id name="id" column="id">

<generator class="native"></generator>

</id>

<property name="name" column="name"></property>

<set name="teachers" table="t_s" inverse="true">

<key column="s_id"/>

<many-to-many column="t_id" class="Teacher"/>

</set>

</class>

</hibernate-mapping>

hibernate对象关系映射( 一对一,一对多,多对一,多对多的单向,双向映射 ——)的更多相关文章

  1. hibernate对象关系实现(一)一对多

    hibernate是对jdk一个封装工具,实现对象和数据库之间数据映射.使用时涉及到四个问题:a.对象之间的关系在类中的体现:b,对象关系对应的数据库中表之间体现:c.实现a,b在hibernate的 ...

  2. Hibernate 对象关系映射文件

    简介: POJO 类和关系型数据库之间的映射可以用一个 XML 文档来定义 通过 POJO 类的数据库映射文件,Hibernate 可以理解持久化类和数据表之间的对应关系,也可以理解持久化类属性与数据 ...

  3. hibernate对象关系实现(二)一对一

    双向一对一以部门和经理为例: a.部门和经理类中各自由对方的引用:(省略了get/set方法) b.数据库两种方式实现:一种(b.1)是外键映射,并将外键添加唯一约束(至于哪个对象的主键做外键,可随意 ...

  4. hibernate对象关系实现(三)多对多实现

    单向n-n:(catogory-item)一个类别对应多个条目,一个条目对应多个类别 a.以类别类中有条目的集合的引用为例: b.数据库中的体现:建立一个新表,以类别和条目的主键关联的外键做新表的联合 ...

  5. hibernate对象关系映射的配置

    一对一主键关联单双向 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-m ...

  6. Hibernate -- 对象关系映射基础

  7. hibernate对象关系实现(四)继承实现

    继承实现方式分为三种:subclass; joined-subclass;union-subclass a.类中体现   b.库中体现分为三种: b.1:一种方式:人和学生公用一张表,添加一个辨别字段 ...

  8. Hibernate映射一对一关联关系

    映射一对一关联 Hibernate提供了两种映射一对一关联关系的方式,分别是按照外键映射和按照主键映射. 下面是员工表和档案信息表(员工和档案表之间的关系是一对一的关系)  档案表(dept) pub ...

  9. Hibernate学习笔记三:对象关系映射(一对一,一对多,多对一,多对多)

    如需转载,请说明出处:http://www.cnblogs.com/gudu1/p/6895610.html Hibernate通过关系映射来表示数据库中表与表之间的关系,关系映射可以通过两种方式:配 ...

随机推荐

  1. KMP字符串模式匹配详解(转)

    来自CSDN     A_B_C_ABC 网友 KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n);KMP匹配算法.可以证明它的时间复杂度 ...

  2. iOS,OC,图片相似度比较,图片指纹

    上周,正在忙,突然有个同学找我帮忙,说有个需求:图片相似度比较. 网上搜了一下,感觉不是很难,就写了下,这里分享给需要的小伙伴. 首先,本次采用的是OpenCV,图片哈希值: 先说一下基本思路: 1. ...

  3. 测试一下MarkDown

    欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接 ...

  4. c++类型转换Type Cast)

    C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:TYPE b = (TYPE)a.C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. const_cast, ...

  5. Unity 物体围绕圆周运动

    用Unity开发游戏中,经常会有搜寻的功能,这时候我们需要一个放大镜的图标在那圆周运动.写了相关脚本直接挂载在要圆周运动的物体上即可: using UnityEngine; using System. ...

  6. 大型系统OA--技术

    OA办公自动化系统--技术 1.由于涉及企业的流程控制与规则管理.所以系统对于规范要求的严谨性,导致在小型开发组在进行开发时必须基于成熟的技术架构.开源的lemon OA,采用了如下技术细节: mys ...

  7. %3A%2F%2F这样的叫什么码啊?

    %3A -> 3A -> 16*3+10 -> 58 -> chr(58) = ":"%2F -> 2F -> 16*2+15 -> 47 ...

  8. MyEclipse Spring被删之后,如何在myeclipse里面重新导入

    1.找到项目文件 2.用记事本打开 .project 把里面涉及到spring的全部删除就可以了.

  9. Distinct Subsequences——Leetcode

    Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...

  10. debian添加sudo

    debian安装好默认没有sudo,都要su到root,感觉很容易手抖打错命令. 于是通过  apt-get install sudo安装sudo 然后就是添加有权限的用户到 /etc/sudoers ...