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() default true;
    String mappedBy() default "";
}
# targetEntity属性表示默认关联的实体类型,默认为当前标注的实体类;
# cascade属性表示与此实体一对一关联的实体的联级样式类型。联级样式上当对实体进行操作时的策略。
     说明:在定义关系时经常会涉及是否定义Cascade(级联处理)属性,担心造成负面影响.
        ·不定义,则对关系表不会产生任何影响
        ·CascadeType.PERSIST (级联新建)
        ·CascadeType.REMOVE (级联删除)
        ·CascadeType.REFRESH (级联刷新)
        ·CascadeType.MERGE (级联更新)中选择一个或多个。
        ·还有一个选择是使用CascadeType.ALL ,表示选择全部四项
# fetch属性是该实体的加载方式,有两种:LAZY和EAGER。
# optional属性表示关联的实体是否能够存在null值。默认为true,表示可以存在null值。如果为false,则要同时配合使用@JoinColumn标记。
# mappedBy属性用于双向关联实体时,标注在不保存关系的实体中。

关联指定列(@JoinColumn)
# @JoinColumn用于注释表中的字段,与@Column不同的是它要保存表与表之间关系的字段;
# name属性是用来标记表中对应的字段的名称。如果不设置name的值,默认情况下,name的取值规则如下:
    name=关联的表的名称 + "_" + 关联表主键的字段名
# 默认情况下,关联的实体的主键一般用来做外键的。如果不想用主键作为外键,则需要设置referencedColumnName属性,如:
    @JoinColumn(name="address_id", referencedColumnName="ref_id")
# @JoinColumn可以与@OneToOne、@ManyToOne或@ManyToMany标记同时使用。

一对一单向关联示例:
·客户实体类CustomerEO:
    @Entity
    @Table(name="customer")
    public class CustomerEO implement Serializable{
        @Id
        @GeneratedValue(stragegy=GenerationType=AUTO)
        private int id;

@OneToOne(casade={CascadeTypeType.ALL})
        @JoinColumn(name="address_id")
        private AddressEO address;
        ....
    }
·地址薄类AddressEO:
    @Entity
    @Table(name="address")
    public class AddressEO implement Serializable{
        @Id
        @GeneratedValue(stragegy=GenerationType=AUTO)
        private int id;
        ....
    }

· 双向关联(Bidirectional)
如上述示例中,将AddressEO修改如下:
·地址薄类AddressEO:
    @Entity
    @Table(name="address")
    public class AddressEO implement Serializable{
        @Id
        @GeneratedValue(stragegy=GenerationType=AUTO)
        private int id;

@OneToOne(mappedBy="address")
        privatre CustomerEO customer;
        ....
    }
即可。

* 以上所有示例及关系中表结构如下:
    TABLE customer(id int, name varcher, address_id int, PRIMARY KEY id)
    TABLE address(id int, address_name varcher, zipcode varcher, city varcher, PRIMARY KEY id)

· 主键关联(@PrimaryKeyJoinColumn)
# 在关联的两个实体中直接使用@PrimaryKeyJoinColumn注释;
# 在上述表结构中需要在customer表中去掉address_id字段;
示例:
·客户实体类CustomerEO:
    @Entity
    @Table(name="customer")
    public class CustomerEO implement Serializable{
        @Id
        @GeneratedValue(stragegy=GenerationType=AUTO)
        private int id;

@OneToOne(casade={CascadeTypeType.ALL})
        @PrimaryKeyJoinColumn
        private AddressEO address;
        ....
    }
·地址薄类AddressEO:
    @Entity
    @Table(name="address")
    public class AddressEO implement Serializable{
        @Id
        @GeneratedValue(stragegy=GenerationType=AUTO)
        private int id;

@PrimaryKeyJoinColumn
        privatre CustomerEO customer;
        ....
    }

·默认关联
如果表中使用了外键,则在映射实体中不需要做其他的设置。
    @Entity
    @Table(name="customer")
    public class CustomerEO implement Serializable{
        @Id
        @GeneratedValue(stragegy=GenerationType=AUTO)
        private int id;

@OneToOne
        private AddressEO address;
        ....
    }

一对一映射的步骤:
1. 确定实体间关系;
2. 考虑表结构;
3. 考虑实体关系的方向性;
若为双向关联,则在保存实体关系的实体中,要配合@JoinColumn注释;在没有保存实体关系的实体中,要用mappedBy属性明确所关联的实体。

来源: http://blog.sina.com.cn/s/blog_49fd52cf0100s0y7.html

时间: 2024-10-21 05:46:57

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

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

JPA总结——实体关系映射(一对多@OneToMany) 并注明来源: http://blog.sina.com.cn/s/blog_49fd52cf0100scql.html 一对多模型(单向)说明:一个客户对应多个地址,通过客户可以获得该客户的多个地址的信息.客户和地址是一对多的关系,并且客户与地址是单向关联的关系. 映射策略# 外键关联:两个表的关系定义在一个表中:# 表关联:两个表的关系单独定义一个表中通过一个中间表来关联.映射策略——外键关联 表结构如下: 1 TABLE custom

持久化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之实体关系映射

延迟加载与即时加载 例如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

hibernate学习四(关系映射一对一)

一.关系映射简介 在数据库中,表与表的关系,仅有外键.但使用hibernate后,为面向对象的编程,对象与对象的关系多样化:如 一对一,一对多,多对多,并具有单向和双向之分. 开始练习前,复制上一次项目,并更名为 二.一对一单向外键关联 例如:一个老师只教一个学生,一个学生只能被一个老师教 关系图如: 修改teahcer.java和student.java类(为了简单起见吧Student也更改为使用Annotation的形式) 1 package com.model; 2 3 import ja

JPA关系映射之one-to-one

一对一关联有两种实现方式:一种是共享的主键关联,另一种是一对一的外键关联 1.共享的主键关联:让两个对象具有共同的主键值,以表明他们之间的一一对应关系. Person.java类 1 public class Person implements java.io.Serializable { 2 3 // Fields 4 5 private Integer id; 6 private String name; 7 private Idcard idcard; 8 9 // Constructor