首页  >  文章  >  Java  >  如何利用 Hibernate 和 Spring 注释来建立和管理实体之间的一对多、多对一和多对多关系?

如何利用 Hibernate 和 Spring 注释来建立和管理实体之间的一对多、多对一和多对多关系?

Barbara Streisand
Barbara Streisand原创
2024-11-02 22:00:30220浏览

How can I leverage Hibernate and Spring annotations to establish and manage one-to-many, many-to-one, and many-to-many relationships between entities?

在 Hibernate 和 Spring 中使用注解创建关系

一对多关系

  • Uni- orientation: 所属类 Foo 维护一个 Bars 列表。在数据库中,Bars 将有一个指向 Foo 的外键。

    <code class="java">@Entity
    public class Foo {
      @OneToMany
      private List<Bar> bars;
    }
    
    @Entity
    public class Bar {
      @ManyToOne
      @JoinColumn(name="fooId")
      private Foo foo;
    }</code>
  • 双向: Foo 和 Bar 都维护彼此的引用。

    <code class="java">@Entity
    public class Foo {
      @OneToMany(mappedBy="foo")
      private List<Bar> bars;
    }
    
    @Entity
    public class Bar {
      @ManyToOne
      @JoinColumn(name="fooId")
      private Foo foo;
    }</code>

多对一关系

  • 单向:所属类 Bar 引用 Foo 。在数据库中,Foo 将有一个指向 Bar 的外键。

    <code class="java">@Entity
    public class Bar {
      @ManyToOne
      @JoinColumn(name="fooId")
      private Foo foo;
    }
    
    @Entity
    public class Foo {
      // No corresponding mapping to Bar
    }</code>
  • 双向: Foo 和 Bar 都维护彼此的引用。

    <code class="java">@Entity
    public class Bar {
      @ManyToOne
      @JoinColumn(name="fooId")
      private Foo foo;
    }
    
    @Entity
    public class Foo {
      @OneToMany(mappedBy="foo")
      private List<Bar> bars;
    }</code>

多对多关系

  • 使用桥接表:创建一个连接表来存储关系。

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

配置选项

  • orphanRemoval:当为 true 时,孤立实体(未被任何父级引用的实体)将被删除lush。
  • fetchType:控制用于延迟加载集合的获取策略的类型。
  • cascade:指定级联的操作子实体的父实体。

故障排除

  • LazyInitializationException:在未首先初始化的情况下尝试访问延迟加载的集合时发生。
  • 性能问题:过度使用预取会降低性能。
  • orphanRemoval:谨慎使用以避免不必要的数据库删除。

以上是如何利用 Hibernate 和 Spring 注释来建立和管理实体之间的一对多、多对一和多对多关系?的详细内容。更多信息请关注PHP中文网其他相关文章!

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