java-jpa映射关联关系

本是古典 何须时尚 2022-05-19 03:56 339阅读 0赞

1.双向一对多及多对一映射:

  • 双向一对多关系中,必须存在一个关系维护端,在 JPA 规范中,要求 many 的一方作为关系的维护端(owner side), one 的一方作为被维护端(inverse side)。
  • 可以在 one 方指定 @OneToMany 注释并设置 mappedBy 属性,以指定它是这一关联中的被维护端,many 为维护端。
  • 在 many 方指定 @ManyToOne 注释,并使用 @JoinColumn 指定外键名称

    //映射单向 1-n 的关联关系

    1. //使用 @OneToMany 来映射 1-n 的关联关系
    2. //使用 @JoinColumn 来映射外键列的名称
    3. //可以使用 @OneToMany 的 fetch 属性来修改默认的加载策略
    4. //可以通过 @OneToMany 的 cascade 属性来修改默认的删除策略.
    5. //注意: 若在 1 的一端的 @OneToMany 中使用 mappedBy 属性, 则 @OneToMany 端就不能再使用 @JoinColumn 属性了.

    // @JoinColumn(name=”CUSTOMER_ID”)

    1. @OneToMany(fetch=FetchType.LAZY,cascade={CascadeType.REMOVE},mappedBy="customer")
    2. public Set<Order> getOrders() {
    3. return orders;
    4. }

    //映射单向 n-1 的关联关系

    1. //使用 @ManyToOne 来映射多对一的关联关系
    2. //使用 @JoinColumn 来映射外键.
    3. //可使用 @ManyToOne 的 fetch 属性来修改默认的关联属性的加载策略
    4. @JoinColumn(name="CUSTOMER_ID")
    5. @ManyToOne(fetch=FetchType.LAZY)
    6. public Customer getCustomer() {
    7. return customer;
    8. }

2.双向一对一映射

  • 基于外键的 1-1 关联关系:在双向的一对一关联中,需要在关系被维护端(inverse side)中的 @OneToOne 注释中指定 mappedBy,以指定是这一关联中的被维护端。同时需要在关系维护端(owner side)建立外键列指向关系被维护端的主键列。
  • 如果延迟加载要起作用, 就必须设置一个代理对象.
  • Manager 其实可以不关联一个 Department
  • 如果有 Department 关联就设置为代理对象而延迟加载, 如果不存在关联的 Department 就设置 null, 因为外键字段是定义在 Department 表中的,Hibernate 在不读取 Department 表的情况是无法判断是否有关联有 Deparmtment, 因此无法判断设置 null 还是代理对象, 而统一设置为代理对象,也无法满足不关联的情况, 所以无法使用延迟加载,只 有显式读取 Department.

    //使用 @OneToOne 来映射 1-1 关联关系。

    1. //若需要在当前数据表中添加主键则需要使用 @JoinColumn 来进行映射. 注意, 1-1 关联关系, 所以需要添加 unique=true
    2. @JoinColumn(name="MGR_ID", unique=true)
    3. @OneToOne(fetch=FetchType.LAZY)
    4. public Manager getMgr() {
    5. return mgr;
    6. }

    //对于不维护关联关系, 没有外键的一方, 使用 @OneToOne 来进行映射, 建议设置 mappedBy=true

    1. @OneToOne(mappedBy="mgr")
    2. public Department getDept() {
    3. return dept;
    4. }

3.双向多对多关联关系

  • 在双向多对多关系中,我们必须指定一个关系维护端(owner side),可以通过 @ManyToMany 注释中指定 mappedBy 属性来标识其为关系维护端。

    @ManyToMany(mappedBy=”categories”)

    1. public Set<Item> getItems() {
    2. return items;
    3. }

    //使用 @ManyToMany 注解来映射多对多关联关系

    1. //使用 @JoinTable 来映射中间表
    2. //1. name 指向中间表的名字
    3. //2. joinColumns 映射当前类所在的表在中间表中的外键
    4. //2.1 name 指定外键列的列名
    5. //2.2 referencedColumnName 指定外键列关联当前表的哪一列
    6. //3. inverseJoinColumns 映射关联的类所在中间表的外键
    7. @JoinTable(name="ITEM_CATEGORY",
    8. joinColumns={@JoinColumn(name="ITEM_ID", referencedColumnName="ID")},
    9. inverseJoinColumns={@JoinColumn(name="CATEGORY_ID", referencedColumnName="ID")})
    10. @ManyToMany
    11. public Set<Category> getCategories() {
    12. return categories;
    13. }

发表评论

表情:
评论列表 (有 0 条评论,339人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Hibernate 03-配置关联关系映射

    一、了解关联关系 类与类之间最普遍的关系就是关联关系,并且关联是有方向的。以部门(Dept)和员工(Emp)类为例,一个部门下有多个员工,而一个员工只能属于一个部门