一对多@OneToMany小结

转载 2015年07月09日 11:47:48
一对多模型(单向)
说明: 一个客户对应多个地址,通过客户可以获得该客户的多个地址的信息。客户和地址是一对多的关系,并且客户与地址是单向关联的关系。

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

映射策略——外键关联

表结构如下:
   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;

        }
        ....
    }

相关文章推荐

Hibernate关系映射(四)一对多单向关联@OneToMany Annotation方式

本篇介绍一对多单向关联,实例还是和Hibernate关系映射(三)多对一单向关联中的例子一样,一个车主(Owner)可以有多辆车,一辆车(Car)只能有一个车主,下面是表结构: 表结构和多对一的...

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

一对多模型(单向) 说明: 一个客户对应多个地址,通过客户可以获得该客户的多个地址的信息。客户和地址是一对多的关系,并且客户与地址是单向关联的关系。 映射策略 # 外键关联:两个表的关系定义...

实体关系映射(一对多@OneToMany)

一对多模型(单向) 说明: 一个客户对应多个地址,通过客户可以获得该客户的多个地址的信息。客户和地址是一对多的关系,并且客户与地址是单向关联的关系。映射策略外键关联:两个表的关系定义在一个表中; 表...

ibatis入门尝试5 一对多(OneToMany)关联

其实一对多关联跟我们之前的一对一关联在实现上没有区别,这里只是简单举例子说明一下。 我们以客户对订单为例。 首先创建数据库Java代码 CREATE TABLE `customer` ( ...

@OneToMany单向一对多

Hibernate单项一对多详细配置: 数据模型: 一个年级有多个学生,每个学生只属于一个年级。 用hibernate实现一对多关系有xml配置和注解两种方式,下面逐一介绍: 第一种:注解方式 Gr...

【JPA 级联保存/级联删除】@OneToMany (双向) 一对多

看过前两篇帮助文档 【JPA】 @OneToOne 单向 和 【JPA】@OneToOne 双向 想必大家对级联操作已经充满了好奇和期待吧。那么本文将会想大家介绍JPA的级联保存操作。在此之前,我...

常规功能和模块自定义系统 (cfcmms)—053把一对多(OneToMany)字段的grid加入到form中

053把一对多(OneToMany)字段的grid加入到form中   前二章中加入了oneToMany字段,并且加入到form中显示条数,并且有一个按钮可以用来打开oneToMany的模块来进行...
  • jfok
  • jfok
  • 2016-07-08 16:39
  • 682

[学习小结]Mybaits的关联表查询:一对一关联和一对多关联

一对一关联 创建表和数据 CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR(20) ); CRE...

android对象关系映射框架ormlite之一对多(OneToMany)

前两天,用ormlite对单张表进行了基本的操作,但是,我们知道通常情况对于单张表格进行操作在实际情况中很前两天不现实,那么ormlite能否像Hibenate那样实现多张表之间的一对多,多对多(即O...

Hibernate基础之九:多对多,单/双向关联 @ManyToOne @OneToMany

1.组件映射,一个类中包含另一个 组件上@Eembeded 2.多对一,单向关联 “多的”聚合“一的”1个实例, Group--User user的getGroup上加@ManyToOne ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)