首页  >  文章  >  Java  >  如何使用注释定义 Hibernate 和 Spring 中的关系?

如何使用注释定义 Hibernate 和 Spring 中的关系?

Patricia Arquette
Patricia Arquette原创
2024-11-03 09:10:03769浏览

How Can You Define Relationships in Hibernate and Spring Using Annotations?

在 Hibernate 4 和 Spring 中使用注解定义关系

单向和双向关系

一对一关系

单向:

<code class="java">class Foo {
    private Bar bar;
}

class Bar {
}</code>

双向(由 Foo 类管理):

<code class="java">class Foo {
    @OneToOne(cascade = CascadeType.ALL)
    private Bar bar;
}

class Bar {
    @OneToOne(mappedBy = "bar")
    private Foo foo;
}</code>

一对多关系

使用用户管理连接表的单向:

<code class="java">class Foo {
    @OneToMany
    @JoinTable(name = "FOO_BAR",
        joinColumns = {@JoinColumn(name = "fooId")},
        inverseJoinColumns = {@JoinColumn(name = "barId")})
    private List<Bar> bars;
}

class Bar {
    // No corresponding mapping to Foo.class
}

@Entity
@Table(name = "FOO_BAR")
class FooBar {
    private UUID fooBarId;
    private Foo foo;
    private Bar bar;
}</code>

使用外键映射的双向:

<code class="java">class Foo {
    @OneToMany(mappedBy = "bar")
    private List<Bar> bars;
}

class Bar {
    @ManyToOne
    @JoinColumn(name = "fooId")
    private Foo foo;
}</code>

多对多关系

使用 Hibernate 托管联接表的双向:

<code class="java">class Foo {
    @OneToMany
    @JoinTable(name = "FOO_BAR",
        joinColumns = {@JoinColumn(name = "fooId")},
        inverseJoinColumns = {@JoinColumn(name = "barId")})
    private List<Bar> bars;
}

class Bar {
    @OneToMany
    @JoinTable(name = "FOO_BAR",
        joinColumns = {@JoinColumn(name = "barId")},
        inverseJoinColumns = {@JoinColumn(name = "fooId")})
    private List<Foo> foos;
}</code>

使用用户管理的联接表的双向:

<code class="java">class Foo {
    @OneToMany(mappedBy = "bar")
    private List<FooBar> bars;
}

class Bar {
    @OneToMany(mappedBy = "foo")
    private List<FooBar> foos;
}

@Entity
@Table(name = "FOO_BAR")
class FooBar {
    private UUID fooBarId;
    private Foo foo;
    private Bar bar;
}</code>

确定关系所有权

  • 一般来说,拥有集合的对象拥有该关系。

选择FetchType

  • 默认:LAZY
  • 对经常出现的集合使用 EAGER
  • 考虑使用 Hibernate.initialize() 或 FetchMode.SUBSELECT 来获取特定方法中所需的延迟加载集合。

确定级联方向

  • 除非指定,否则级联操作仅朝一个方向进行。
  • 标记@OneToMany 注释,用于关系所属方的级联。

孤儿移除

  • OrphanRemoval = true:删除不再在任何其他关系中引用的孤立对象。

以上是如何使用注释定义 Hibernate 和 Spring 中的关系?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn