JPA总结——实体关系映射(一对多@OneToMany)

注意:本文出自“阿飞”的博客,如果要转载本文章,请与作者联系!

并注明来源: http://blog.sina.com.cn/s/blog_49fd52cf0100scql.html

一对多模型(单向)
说明:一个客户对应多个地址,通过客户可以获得该客户的多个地址的信息。客户和地址是一对多的关系,并且客户与地址是单向关联的关系。

映射策略
# 外键关联:两个表的关系定义在一个表中;
# 表关联:两个表的关系单独定义一个表中通过一个中间表来关联。

映射策略——外键关联

表结构如下:

    TABLE customer(id int, name varcher, PRIMARY KEY id)
TABLE address(id int, address_name varcher, zipcode varcher, city varcher, customer_id int, PRIMARY KEY id)

表address中的customer_id为customer表中的id的值,通过customer_id可以找到相应的customer的记录。
将表customer映射为CustomerEO实体,代码如下:

 1     @Entity
2 @Table(name="customer")
3 public class CustomerEO implement Serializable{
4 @Id
5 @GeneratedValue(stragegy=GenerationType=AUTO)
6 private int id;
7
8 @OneToMany(casade={CascadeTypeType.ALL})
9 @JoinColumn(name="customer_id")
10 public Collection<AddressEO> getAddress() {
11 return address;
12 }
13 ....
14 }

一对多@OneToMany注解说明:

 @Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface OneToMany {
Class targetEntity() default void.class;
CascadeType[] cascade() default {};
FetchType fetch() default EAGER;
String mappedBy() default "";
}

# targetEntity属性表示默认关联的实体类型,默认为当前标注的实体类;
因为一对多的实体集合时保存在集合类中,因此必须指明集合类中保存的具体类型:
1)指定集合泛型的具体类型;如:public Collection<AddressEO> getAddress() {...
2)指定targetEntity属性类型;如:@OneToMany(targetEntity=AddressEO.class,casade={CascadeTypeType.ALL})
# cascade属性表示与此实体一对一关联的实体的联级样式类型。联级样式上当对实体进行操作时的策略。
     说明:在定义关系时经常会涉及是否定义Cascade(级联处理)属性,担心造成负面影响.
        ·不定义,则对关系表不会产生任何影响
        ·CascadeType.PERSIST (级联新建)
        ·CascadeType.REMOVE (级联删除)
        ·CascadeType.REFRESH (级联刷新)
        ·CascadeType.MERGE (级联更新)中选择一个或多个。
        ·还有一个选择是使用CascadeType.ALL ,表示选择全部四项
# fetch属性是该实体的加载方式,有两种:LAZY和EAGER。默认为惰性加载,一般也建议使用惰性加载。
# mappedBy属性用于双向关联实体时使用。

映射策略——表关联
在具体的设计中我们也会使用到使用另外单独的一张表来关联实体关系。比如customer和address例子中,我们增加一张ref_customer_address表保存以上两表的关系。
表结构如下:

    TABLE customer(id int, name varcher, PRIMARY KEY id)
TABLE address(id int, address_name varcher, zipcode varcher, city varcher, PRIMARY KEY id) TABLE ref_customer_address(customer_id int not null, address_id int not null unique)

将表customer映射为CustomerEO实体,代码如下:

  @Entity
@Table(name="customer")
public class CustomerEO implement Serializable{
@Id
@GeneratedValue(stragegy=GenerationType=AUTO)
private int id; @OneToMany(casade={CascadeTypeType.ALL})
@JoinTable(name="ref_customer_address",
joinColumn={@JoinColumn(name="customer_id",referencedColumnName="id")},
inverseJoinColumn={@JoinColumn(name="address_id",referencedColumnName="id")}
)
public Collection<AddressEO> getAddress() {
return address;
}
....
}

表关联(@JoinTable)注解说明:

 @Target({METHOD, FIELD})
public @interface JoinTable{
String name() default "";
String catalog() default "";
String schema() default "";
JoinColumn[] joinColumns() default {};
JoinColumn[] inverseJoinColumns() default {};
UniqueConstraint[] uniqueConstraints default {};
}

# name属性为连接两个表的表名称。若不指定,则使用默认的表名称,格式如下:
      "表名1" + "_" + "表名2"
# joinColumn属性表示,在保存关系的表中,所保存关联关系的外键的字段,并配合@JoinColumn标记使用;
# inverseJoinColumn属性与joinColumn类似,它保存的是保存关系的另外一个外键字段;
# catalog和schema属性表示实体指定点目录名称或数据库名称;
# uniqueConstraints属性表示该实体所关联的唯一约束条件,一个实体可以有多个唯一约束条件,默认没有约束;

注意:@JoinTable不仅能够定义一对多的关联,也可以定义多对多表的关联。

默认关联
如果使用了表关联,并且该表又设置了外键,则在映射的实体关系时可以使用默认的映射关系设置,举例如下:
表结构如下:

    TABLE customer(id int, name varcher, PRIMARY KEY id)
TABLE address(id int, address_name varcher, zipcode varcher, city varcher, PRIMARY KEY id) TABLE ref_customer_address(customer_id int not null, address_id int not null unique)
--创建customer_id外键
ALTER TABLE ref_customer_address ADD CONSTRAINT fk_ref_customer FOREIGN KEY (customer_id) REFERENCES customer (id);
--创建address_id外键
ALTER TABLE ref_customer_address ADD CONSTRAINT fk_ref_address FOREIGN KEY (address_id) REFERENCES address(id);

映射实体CustomerEO的代码如下:

 @Entity
@Table(name="customer")
public class CustomerEO implement Serializable{
@Id
@GeneratedValue(stragegy=GenerationType=AUTO)
private int id; @OneToMany
public Collection<AddressEO> getAddress() {
return address;
}
....
}

JPA总结——实体关系映射(一对多@OneToMany)的更多相关文章

  1. JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析

    JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...

  2. [刘阳Java]_MyBatis_实体关系映射_第8讲

    MyBatis既然是一个ORM框架,则它也有像Hibernate那样的一对多,多对多,多对一的实体关系映射功能.下面我们就来介绍一下如何使用MyBatis的实体关系映射 1.MyBatis实体关系映射 ...

  3. OrchardNoCMS实体关系映射扩展

    在OrchardNoCMS中,默认的系统会把实体关系映射保存到mappings.bin文件中. 如果不进行任何修改,默认的可以自动保存关系映射的model是有很大限制的. 条件是model的命名空间必 ...

  4. Hibernate实体关系映射(OneToMany、ManyToOne双边)——完整实例

    双边关系是最常见的配置.在多方有一方的引用,一方也有多方的引用.双边关系能够很方便地查询数据.看一个班级与学生的双边关系. 班级(Clazz类)与学生(Student类):一对多关系.班级中有学生属性 ...

  5. Hibernate之实体关系映射

    延迟加载与即时加载 例如Person类和Email类是一对多关系,如果设为即时加载,当加载Person时,会自动加载Email,如果设置为延迟加载,当第一次调用person.getEmails()时才 ...

  6. hibernate 实体关系映射笔记

    @经常使用属性说明:     @Entity:实体类     @Table:指定相应数据表     @Id:主键,使用能够为null值的类型,假设实体类没有保存到数据库是一个暂时状态     @Col ...

  7. Hibernate框架关系映射一对多双向关联

    直入主题,首先大配置常规配置, 这里住要说关联关系,大配置不多少,而且jar包默认添加好,笔者用的是idea2016. 然后我们知道关联关系主要是在小配置添加节点来配置属性.个人认为关联映射,就是对应 ...

  8. Hibernate实体关系映射(OneToMany单边)——完整实例

    单边一对多关系:电子邮件管理 单边一对多关系:指一方有集合属性,包含多个多方,而多的一方没有一方的引用. 比如:用户(一)与电子邮件(多).一个用户可以有多个电子邮件记录. 目的:通过OneToMan ...

  9. JPA实体继承映射

    注意:据说,在本文所指的实体是@Entity注解的类. JPA在对象 - 关系映射通常情况下一个实体对应表,不管是什么这两个实体之间的关系.假设两个实体之间的继承关系.那么它是如何映射? JPA实体支 ...

随机推荐

  1. mstsc本地驱动器

    mstsc 可以把本地驱动器 挂载到服务器上

  2. TLS/SSL简单过程

    .wcf的认证分为两种 1.1 transport模式,在传输层完成认证(只能在传输层完成认证,利用硬件加速效率更高) a.在使用transport模式,非windows凭证的情况下默认使用TLS/S ...

  3. pyspider示例代码七:自动登陆并获得PDF文件下载地址

    自动登陆并获得PDF文件下载地址 #!/usr/bin/env python # -*- encoding: utf- -*- # Created on -- :: # Project: pdf_sp ...

  4. centos7 jenkins安装和使用

    jenkins 安装和使用 1.先安装jdK1.8 和 maven 此步骤省略 2.进入jenkisn 官网 下载https://jenkins.io/download/ Long-term Supp ...

  5. 2018.07.08 hdu5316 Magician(线段树)

    Magician Problem Description Fantasy magicians usually gain their ability through one of three usual ...

  6. Django基础(二)

    https://www.cnblogs.com/yuanchenqi/articles/5716193.html

  7. py-函数基础

    定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 特性: 1.减少重复代码2.使程序变的可扩展3.使程序变得易维护 函数参数 形参变量 只有在被调 ...

  8. UVa 12034 Race (递推+组合数学)

    题意:A,B两个人比赛,名次有三种情况(并列第一,AB,BA).输入n,求n个人比赛时最后名次的可能数. 析:本来以为是数学题,排列组合,后来怎么想也不对.原来这是一个递推... 设n个人时答案为f( ...

  9. addEvent兼容版

    function addEvent(elem,type,handle){ if (elem.addEventlistener) { elem.addEventlistener(type,handle, ...

  10. 在linux系统中安装VSCode(Visual Studio Code)和图标的创建方式

    本文转载自:https://www.cnblogs.com/lzpong/p/6145511.html,自己添加了一些关于依赖包安装的. 1.从官网下载压缩包(话说下载下来解压就直接可以运行了咧,都不 ...