• Hibernate注解配置1:N关联


    多对一

    使用 @ManyToOne 注解定义多对一关系。

    @Entity()

    public class Flight implements Serializable {

      @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )

      @JoinColumn(name="COMP_ID")

      public Company getCompany() {

        return company;

      }

      ...

    }

    其中@JoinColumn 注解是可选的,关键字段默认值和一对一关联的情况相似。列名为:主题的关联属性名 + 下划线 + 被关联端的主键列名。本例中为company_id,因为关联的属性是company, Company的主键为 id.

    @ManyToOne 注解有个targetEntity属性,该参数定义了目标实体名。通常不需要定义,大部分情况为默认值。但下面这种情况则需要 targetEntity 定义(使用接口作为返回值,而不是常用的实体)。

    @Entity()

    public class Flight implements Serializable {

       @ManyToOne(cascade=   {CascadeType.PERSIST,CascadeType.MERGE},targetEntity= CompanyImpl.class)

       @JoinColumn(name="COMP_ID")

       public Company getCompany() {

         return company;

       }

       ...

    }

    public interface Company {

       ...

    多对一也可以通过关联表的方式来映射,通过 @JoinTable 注解可定义关联表。该关联表包含指回实体的外键(通过@JoinTable.joinColumns)以及指向目标实体表的外键(通过@JoinTable.inverseJoinColumns).

    @Entity()

    public class Flight implements Serializable {

       @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )

       @JoinTable(name="Flight_Company",

           joinColumns = @JoinColumn(name="FLIGHT_ID"),

           inverseJoinColumns = @JoinColumn(name="COMP_ID")

       )

       public Company getCompany() {

           return company;

       }

       ...

    }

    集合类型

     一对多

    @OneToMany 注解可定义一对多关联。一对多关联可以是双向的。

    双向

    规范中多对一端几乎总是双向关联中的主体(owner)端,而一对多的关联注解为 @OneToMany(mappedBy=)

    @Entity

    public class Troop {

      @OneToMany(mappedBy="troop")

      public Set<Soldier> getSoldiers() {

      ...

    }

    @Entity

    public class Soldier {

      @ManyToOne

      @JoinColumn(name="troop_fk")

      public Troop getTroop() {

      ...

      }

    Troop 通过troop属性和Soldier建立了一对多的双向关联。在 mappedBy 端不必也不能定义任何物理映射。

    单向

    @Entity

    public class Customer implements Serializable {

       @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)

       @JoinColumn(name="CUST_ID")

       public Set<Ticket> getTickets() {

          ...

       }

    @Entity

    public class Ticket implements Serializable {

       ... //no bidir

    }

    一般通过连接表来实现这种关联,可以通过@JoinColumn注解来描述这种单向关联关系。上例 Customer 通过 CUST_ID 列和 Ticket 建立了单向关联关系。

    通过关联表来处理单向关联

    @Entity

    public class Trainer {

      @OneToMany

      @JoinTable(

         name="TrainedMonkeys",

         joinColumns = @JoinColumn( name="trainer_id"),

         inverseJoinColumns = @JoinColumn( name="monkey_id")

      )

      public Set<Monkey> getTrainedMonkeys() {

         ...

      }

    @Entity

    public class Monkey {

      ... //no bidir

    }

    通过关联表来处理单向一对多关系是首选,这种关联通过 @JoinTable 注解来进行描述。上例子中 Trainer 通过TrainedMonkeys表和Monkey建立了单向关联关系。其中外键trainer_id关联到Trainer(joinColumns)而外键monkey_id关联到Monkey(inverseJoinColumns).

    默认处理机制

    通过连接表来建立单向一对多关联不需要描述任何物理映射,表名由一下3个部分组成,主表(owner table)表名 + 下划线 + 从表(the other side table)表名。指向主表的外键名:主表表名+下划线+主表主键列名 指向从表的外键定义为唯一约束,用来表示一对多的关联关系。

    @Entity

    public class Trainer {

      @OneToMany

      public Set<Tiger> getTrainedTigers() {

      ...

    }

    @Entity

    public class Tiger {

      ... //no bidir

    }

    上述例子中 Trainer 和 Tiger 通过 Trainer_Tiger 连接表建立单向关联关系。其中外键 trainer_id 关联到 Trainer表,而外键 trainedTigers_id 关联到 Tiger 表。

  • 相关阅读:
    FMDB使用的一点心得:数据库创建、制表、查询等以及image转换成二进制nsdata保存到数据库中
    Java基本数据类型
    hashtable C++实现
    Libgdx中TextButton的一些思考
    [伯努利数] poj 1707 Sum of powers
    POJ 3020:Antenna Placement(无向二分图的最小路径覆盖)
    flume 读取kafka 数据
    [R] 之 帮助函数
    [python] 之 类编码细节
    [python] 之 装饰器
  • 原文地址:https://www.cnblogs.com/winkey4986/p/2575255.html
Copyright © 2020-2023  润新知