zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    26 转义符 re模块 方法 random模块 collection模块的Counter方法
    25 正则表达式
    24 from 模块 import 名字
    24 from 模块 import 名字
    24 from 模块 import 名字
    23 析构方法 items系列 hash方法 eq方法
    21 isinstance issubclass 反射 _str_ _new_ _len_ _call_
    20 属性, 类方法, 静态方法. python2与python3的区别.
    python(1)
    python之字符串格式化
  • 原文地址:https://www.cnblogs.com/shiddong/p/5580485.html
Copyright © 2011-2022 走看看