hibernate对象关系映射( 一对一,一对多,多对一,多对多的单向,双向映射 ——)
对象之间的关系:
关系映射之间的关系只的是对象之间的关系,并不指数据库表的关系(外键关系)这儿解决的问题是当对象之间的关系之一时,数据库表该如何映射,编程上如何对待。
一对一(主键关联,和单向的外键关联)
①单向(主键,外键)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对象关系映射( 一对一,一对多,多对一,多对多的单向,双向映射 ——)的更多相关文章
- hibernate对象关系实现(一)一对多
hibernate是对jdk一个封装工具,实现对象和数据库之间数据映射.使用时涉及到四个问题:a.对象之间的关系在类中的体现:b,对象关系对应的数据库中表之间体现:c.实现a,b在hibernate的 ...
- Hibernate 对象关系映射文件
简介: POJO 类和关系型数据库之间的映射可以用一个 XML 文档来定义 通过 POJO 类的数据库映射文件,Hibernate 可以理解持久化类和数据表之间的对应关系,也可以理解持久化类属性与数据 ...
- hibernate对象关系实现(二)一对一
双向一对一以部门和经理为例: a.部门和经理类中各自由对方的引用:(省略了get/set方法) b.数据库两种方式实现:一种(b.1)是外键映射,并将外键添加唯一约束(至于哪个对象的主键做外键,可随意 ...
- hibernate对象关系实现(三)多对多实现
单向n-n:(catogory-item)一个类别对应多个条目,一个条目对应多个类别 a.以类别类中有条目的集合的引用为例: b.数据库中的体现:建立一个新表,以类别和条目的主键关联的外键做新表的联合 ...
- hibernate对象关系映射的配置
一对一主键关联单双向 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-m ...
- Hibernate -- 对象关系映射基础
- hibernate对象关系实现(四)继承实现
继承实现方式分为三种:subclass; joined-subclass;union-subclass a.类中体现 b.库中体现分为三种: b.1:一种方式:人和学生公用一张表,添加一个辨别字段 ...
- Hibernate映射一对一关联关系
映射一对一关联 Hibernate提供了两种映射一对一关联关系的方式,分别是按照外键映射和按照主键映射. 下面是员工表和档案信息表(员工和档案表之间的关系是一对一的关系) 档案表(dept) pub ...
- Hibernate学习笔记三:对象关系映射(一对一,一对多,多对一,多对多)
如需转载,请说明出处:http://www.cnblogs.com/gudu1/p/6895610.html Hibernate通过关系映射来表示数据库中表与表之间的关系,关系映射可以通过两种方式:配 ...
随机推荐
- UI设计网站参考
1. https://dribbble.com/colors/6A969A 2. 设计师网站导航:http://hao.uisdc.com/ 3. bootstrap的UI:http://www.bo ...
- swift中类似宏定义
建一个类 如,在Contans.swift中 import UIKit let kMAIN_SIZE = UIScreen.mainScreen().bounds 在其他地方直接用 比如在 MyTab ...
- 坑爹的Android Ble 问题记录日志
开发Ble(公司项目,防丢器)已经有一段时间,由于是第一次接触Ble而网上资料又不多,且android平台自身的差异性,遇到了很多问题.为了将来方便查阅,在此做下记录.1.中兴手机,蓝牙手动断开后,无 ...
- 凯撒密码 CH Round #57 - Story of the OI Class
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2357%20-%20Story%20of%20the%20OI%20Class/凯撒密码 题解:刚开始想map, ...
- PHP按最大宽高等比例缩放图片类
本来用phpthumb来缩略图片是十分方便的,但是最近在sae上写项目发现phpthumb在sae上保存文件时会出问题,想来实现一个简单的按最大宽高等比例缩放图片类也并不困难,于是便自己写了一个方便修 ...
- Delphi中使用TXMLDocument控件应注意的问题 转
Delphi中使用TXMLDocument控件应注意的问题 delphiconstructorxmlclass今天写了一个类,其中用到了TXMLDocument控件.这个控件我是要动态生成的. 但是却 ...
- Perfect Squares——Leetcode
Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 1 ...
- UVA 11762 Race to 1(记忆化+期望)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20869 [思路] DP+期望. 设f[x]表示从x转移到1的期望操 ...
- lightoj 1032 二进制的dp
题目链接:http://lightoj.com/volume_showproblem.php?problem=1032 #include <cstdio> #include <cst ...
- Java日志记录的5条规则
日志记录是在软件开发过程中常常需要考虑的关键因素. 当产品运行出错时,日志文件通常是我们进行错误分析的首要选择. 而且,在很多情况下,它们是我们手上唯一可以用来查明发生状况和问题根本原因的信息. 可见 ...