美文网首页
JPA总结——实体关系映射(一对一@OneToOne)

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

作者: 苗義 | 来源:发表于2017-11-05 23:09 被阅读0次

    一对一(@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属性明确所关联的实体。

    相关文章

      网友评论

          本文标题:JPA总结——实体关系映射(一对一@OneToOne)

          本文链接:https://www.haomeiwen.com/subject/vpqkmxtx.html