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

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

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

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

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

映射策略——外键关联

表结构如下:

1    TABLE customer(id int, name varcher, PRIMARY KEY id)
2    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注解说明:

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

# 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表保存以上两表的关系。
表结构如下:

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

将表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         @JoinTable(name="ref_customer_address",
10           joinColumn={@JoinColumn(name="customer_id",referencedColumnName="id")},
11           inverseJoinColumn={@JoinColumn(name="address_id",referencedColumnName="id")}
12        )
13         public Collection<AddressEO> getAddress() {
14               return address;
15         }
16         ....
17     }

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

1 @Target({METHOD, FIELD})
2 public @interface JoinTable{
3     String name() default "";
4     String catalog() default "";
5     String schema() default "";
6     JoinColumn[] joinColumns() default {};
7     JoinColumn[] inverseJoinColumns() default {};
8     UniqueConstraint[] uniqueConstraints default {};
9 }

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

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

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

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

映射实体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
 9         public Collection<AddressEO> getAddress() {
10               return address;
11         }
12         ....
13     }
时间: 2024-08-14 08:04:50

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

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

一对一(@OneToOne) · 单向关联# 注释@OneToOne定义如下:@Target({METHOD, FIELD}) @Retention(RUNTIME)public @interface OneToOne {    Class targetEntity() default void.class;    CascadeType[] cascade() default {};    FetchType fetch() default EAGER;    boolean optional

持久化API(JPA)系列(六)实体关系映射(ORM)之映射类型

ORM实体关系映射,即将数据库中的数据表及表之间的关系,通过实体Bean及实体Bean之间的关系表现出来,实现通过操作实体Bean来操作数据库. ORM(Object-Relation-Map),其中Object表示实体Bean,Relation表示数据表,Map表示实体Bean与数据表的映射. 由于EJB3中的实体Bean采用JPA框架,因此这里的ORM就是指JPA映射.它的作用也类似于Hibernate.iBATIS.JDO.TopLink等持久化层框架中的实体关系映射. 根据表与表之间的关

持久化API(JPA)系列(八)实体关系映射(ORM)之单表映射@EmbeddedId

接上文<持久化API(JPA)系列(七)实体关系映射(ORM)之单表映射@IdClass> 本文将介绍<联合主键:使用@EmbeddedId嵌入外部主键> 上文是通过@IdClass引用外部主键,联合主键也可以采用嵌入式主键替代. 1)新建外部主键类Family2.java 设置联合主键man和woman,因此外部主键也需要定义两个相同的变量,并添加一个以两个变量为输入的构造函数,同时添加getter/setter函数. 主键类必须满足: 1.必须实现Serializable接口,

hibernate 实体关系映射笔记

@常用属性说明: @Entity:实体类 @Table:指定对应数据表 @Id:主键,使用可以为null值的类型,如果实体类没有保存到数据库是一个临时状态 @Column:配置普通属性,除了主键外,java基本类型的属性 @Base:普通属性的加载方式 @GeneratedValue:主键生成策略 @Temporal:日期类型(DATE,TIME还是TIMESTAMP),如果属性类型是java.util.Date(是以上3个类的父类)类型时才需要使用该@声明具体的日期类型 @Transient:

OrchardNoCMS实体关系映射扩展

在OrchardNoCMS中,默认的系统会把实体关系映射保存到mappings.bin文件中. 如果不进行任何修改,默认的可以自动保存关系映射的model是有很大限制的. 条件是model的命名空间必须是以Orchard开头,以Models结尾.CompositionStrategy.cs中可以看到判断一个类是否需要保存映射关系的代码: 假设我们现在想按照公司的名称为Model的命名空间,加添完Model运行后,你会发现,在数据库中进行增删改查是没有数据的,因为根本没有生成关系映射. 你可以通过

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

双边关系是最常见的配置.在多方有一方的引用,一方也有多方的引用.双边关系能够很方便地查询数据.看一个班级与学生的双边关系. 班级(Clazz类)与学生(Student类):一对多关系.班级中有学生属性,学生中有班级属性,二者是双边关系.(Class是关键字,不能用) 分析:Clazz为一方,Student为多方.Clazz中有Student集合属性,Student中也有Clazz类型属性. 环境:MyEclipse10,新建Web Project名为hibernate 1.Clazz.java

Hibernate之实体关系映射

延迟加载与即时加载 例如Person类和Email类是一对多关系,如果设为即时加载,当加载Person时,会自动加载Email,如果设置为延迟加载,当第一次调用person.getEmails()时才会执行SQL语句加载Email 注解配置时,@OnetToMany(Fetch = FetchType.EAGER)为即时加载,Fetch = FetchType.LAZY为延迟加载 延迟加载和即时加载的策略适用于所有一对多.多对一.多对多等所有的实体关系 一般来说,延迟加载要比即时加载节省资源,但

实体关系映射

一.实体关系概述        实体关系是指实体与实体之间的关系,从方向上分为单向关联和双向关联:从实体数量上分一对一,一对多和多对多.1.实体关系的方向性 (1)单向关联    单向关联是一个实体中引用了另外一个实体.简单地说,就是通过一个实体可以获得另一个实体对象.例如,实体A对实体B的单向关联.实体A的代码如下: ? 1 2 3 4 5 6 7 8 9 10 public class EntityA {<span style="font-family:Verdana;"&g

MyBatis的对象关系映射---一对多N+1策略★★★★★

在实际开发中,一个业务可能涉及到多个数据表的查询,那么多表查询就涉及连接查询(等值连接), 等值连接 表与表之间有一个外键关键,但是程序中最终获取的表封装的对象, 对象与对象之间是没有外键关系的,对象和对象之间只有依赖关系: 对象之间关系主要是四种: 一对一 关系一个人对应身份证id,一个QQ号对应一个QQ空间 一对多 关系 一个部门对应多个员工 多对一 关系 多个员工对应一个部门 多对多 关系 多个学生对应多个老师,多个学生对应多个课程 什么关系应该从哪个对象作为中心点来看 一对多, 以one