`

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实体,代码如下:
    @Entity
    @Table(name="customer")
    public class CustomerEO implement Serializable{
        @Id
        @GeneratedValue(stragegy=GenerationType=AUTO)
        private int id;

        @OneToMany(casade={CascadeTypeType.ALL})
        @JoinColumn(name="customer_id")
        public Collection<AddressEO> getAddress() {
              return address;

        }
        ....
    }

一对多@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的一对多和多对多代码

    在数据库中,一对多关系意味着一个父实体可以关联多个子实体,而每个子实体只能属于一个父实体。在JPA中,我们可以使用`@OneToMany`注解来定义这种关系。 ```java @Entity public class ParentEntity { @Id @...

    Hibernate 注解一对多,多对一

    本文将深入探讨Hibernate中的两个关键概念——注解声明的一对多(@OneToMany)和多对一(@ManyToOne)关系,以及如何在实际项目中应用它们。 一、Hibernate注解介绍 Hibernate通过注解简化了Java类与数据库表之间的...

    01_JPA详解_全面阐释和精彩总结JPA.zip

    6. **关系映射**:讲解如何处理实体之间的关联,如一对一、一对多、多对一、多对多关系,并通过`@OneToOne`、`@OneToMany`、`@ManyToOne`、`@ManyToMany`等注解进行配置。 7. **事务管理**:讨论JPA如何处理事务,...

    jpa的基本描述

    例如,一个员工可能属于一个部门,而一个部门可能有多个员工,这种一对多的关系可以用`@ManyToOne`和`@OneToMany`来表示。 - **@Temporal**:用于处理日期时间类型的字段。它可以指定如何将Java中的日期时间类型转换...

    jpa经典文档呀

    8. **关联映射**:JPA支持一对一、一对多、多对一和多对多的关系映射,通过@OneToOne、@OneToMany、@ManyToOne和@ManyToMany注解实现。 9. **懒加载和级联操作**:懒加载可以延迟加载关联的对象,直到真正需要时才...

    jpa的学习---jpa demo工程

    JPA支持多种关系映射,如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。这些注解用于定义实体之间的关联,并可以配置关联的字段、级联操作等。 5. **查询操作** JPA...

    Hibernate实体层设计

    Hibernate支持一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)四种关系映射。例如,一个用户可以有多个订单,订单也可以属于多个用户,这种关系就需要用到@OneToMany和@...

    jpa 所要的jar包

    7. **实体关系映射**:JPA支持多种关系映射,如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。 在实际开发中,结合IDE(如IntelliJ IDEA或Eclipse)的JPA支持,可以更...

    jpa--2.持久化操作

    JPA允许定义实体之间的关系,如一对一、一对多、多对一、多对多。通过`@OneToOne`、`@OneToMany`、`@ManyToOne`、`@ManyToMany`等注解实现对象关系的映射。 ### 10. **继承策略** JPA支持多种继承策略,如单表继承...

    jpa之使用hibernate示例代码

    6. **关联映射**:JPA允许定义实体之间的关联,如一对一(@OneToOne),一对多(@OneToMany),多对一(@ManyToOne)和多对多(@ManyToMany)。这些关联可以通过属性或集合进行映射。 7. **懒加载和即时加载**:...

    春天数据jpa一对多

    总结来说,"春天数据JPA一对多"主要涉及的是Spring Data JPA中实体类之间的关系映射,尤其是`@OneToMany`注解的使用,以及如何通过JpaRepository接口进行操作。理解并熟练运用这些知识,能够帮助开发者高效地处理...

    Java持久化参考资料,JPA批注

    6. `@ManyToOne`, `@OneToOne`, `@OneToMany`, `@ManyToMany`:这些注解用于定义不同类型的关联关系,如一对一、一对多、多对一和多对多。 7. `@JoinColumn`:在关联关系中,用于指定外键列的详细信息。 8. `@...

    HBN学习代码**************

    4. **一对多(OneToMany)关系映射**:`hbnlab4_one2many`和`hbnlab1`目录下的代码展示了如何处理一对多关系,比如一个部门有多个员工。使用@OneToMany注解,可以定义一个实体对应多个实体的关联。 5. **多对多...

    EJB3开发Entity

    EJB3支持一对多(@OneToMany)、多对一(@ManyToOne)、一对一(@OneToOne)和多对多(@ManyToMany)的关系映射,通过注解来定义实体之间的关联。 9. **懒加载和即时加载** EJB3支持懒加载和即时加载策略,控制...

    hibernate注解annotation的jar

    例如,通过@OneToMany和@ManyToOne,可以定义一对多或多对一的关系,而@JoinColumn则用于指定关联的外键。 总的来说,这三个jar包是Hibernate注解开发的基础,它们共同构建了一个强大的ORM环境,让开发者能够专注于...

    ejb3.0 注解 其中一部分

    - **`@OneToMany`**: 一对多关联。 - **`@ManyToOne`**: 多对一关联。 - `mappedBy`属性用于指定关联的另一端,`cascade`属性用于指定级联行为,`fetch`属性指定加载策略。 **示例:** ```java @Entity public ...

    深入浅出Hibernate.pdf

    7. 关联映射:介绍不同类型的关联关系(一对一、一对多、多对一、多对多)的映射,如@OneToOne、@OneToMany、@ManyToOne、@ManyToMany,以及它们的级联操作和懒加载策略。 8. 继承映射:讨论如何处理类的继承关系,...

    hibernate声明文档

    2. **一对多关联(OneToMany)**: 一个实体可以拥有多个其他实体,如部门和员工,使用`@OneToMany`注解。 3. **多对一关联(ManyToOne)**: 多个实体对应一个实体,如员工对应一个部门,使用`@ManyToOne`注解。 4....

    Hibernate_3[1].2.0_Reference_zh_CN

    5. **关联映射(Association Mapping)**:Hibernate支持多种关联类型,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。关联映射使得对象间的关系能够透明地映射到数据库...

Global site tag (gtag.js) - Google Analytics