首页 >Java >java教程 >如何使用注释定义 Hibernate 4 和 Spring 中实体之间的关系?

如何使用注释定义 Hibernate 4 和 Spring 中实体之间的关系?

Susan Sarandon
Susan Sarandon原创
2024-11-03 13:30:30495浏览

How do you define relationships between entities in Hibernate 4 and Spring using annotations?

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

单向一对一关系

创建单向一对一关系一对一关系,在所属类上使用 @OneToOne 注释。配置@JoinColumn注解来指定依赖类的表中保存外键的列的名称。

示例:

<code class="java">public class Foo {
    private Long fooId;

    @OneToOne
    private Bar bar;
}

public class Bar {
    private Long barId;
    // No corresponding mapping to Foo.class
}</code>

双向一对一一个关系

对于双向一对一关系,请使用 @OneToOne 注释两个类。在所属类上使用 @JoinColumn 注释来指定外键列名称。在依赖类上,使用 @JoinColumn 注解将外键映射回所属类。

示例:

<code class="java">public class Foo {
    private Long fooId;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "barId")
    private Bar bar;
}

public class Bar {
    private Long barId;

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

与 User 的单向一对多关系托管连接表

对于使用用户管理的连接表的单向一对多关系,创建一个映射两个类之间关系的连接表类。使用@Entity和@Table注释联接表,并将列映射到父类和子类的主键。

示例:

<code class="java">public class Foo {
    private Long fooId;

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

public class Bar {
    private Long barId;

    // No mapping specified here.
}

@Entity
@Table(name="FOO_BAR")
public class FooBar {
    private UUID fooBarId;

    @ManyToOne
    @JoinColumn(name = "fooId")
    private Foo foo;

    @ManyToOne
    @JoinColumn(name = "barId")
    private Bar bar;

    // You can store other objects/fields on this table here.
}</code>

双向一对多使用外键映射的关系

对于使用外键映射的双向一对多关系,请使用@OneToMany 注释所属类,并使用@ManyToOne 注释依赖类。使用 @JoinColumn 注解指定将在依赖类表中保存外键的列名。

示例:

<code class="java">public class Foo {
    private Long fooId;

    @OneToMany(mappedBy = "bar")
    private List<Bar> bars;
}

public class Bar {
    private Long barId;

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

使用 Hibernate 的双向多对多关系-托管连接表

对于使用 Hibernate 管理的连接表的双向多对多关系,请使用 @OneToMany 注释每个类。创建一个连接表类来映射两个类之间的关系。使用@Entity和@Table注释联接表,并将列映射到父类和子类的主键。

示例:

<code class="java">public class Foo {
    private Long fooId;

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

public class Bar {
    private Long barId;

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

双向多对多使用用户管理的联接表对象的关系

对于使用用户管理的联接表对象的双向多对多关系,创建一个映射两个类之间关系的联接表类。使用@Entity和@Table注释连接表,并将列映射到父类和子类的主键。用 @OneToMany 注解每个类,并将字段映射到连接表类。

示例:

<code class="java">public class Foo {
    private Long fooId;

    @OneToMany(mappedBy = "bar")
    private List<FooBar> bars;
}

public class Bar {
    private Long barId;

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

@Entity
@Table(name="FOO_BAR")
public class FooBar {
    private UUID fooBarId;

    @ManyToOne
    @JoinColumn(name = "fooId")
    private Foo foo;

    @ManyToOne
    @JoinColumn(name = "barId")
    private Bar bar;

    // You can store other objects/fields on this table here.
}</code>

确定级联方向

Hibernate 可以以任一方式或双向进行级联操作处于双向关系。通过在所属类上标记 @OneToMany 注释,级联会按所需方向进行更改。一般来说,建议在关系的拥有方标记级联。

孤立对象删除

孤立对象删除可确保自动从数据库中删除不再与父对象关联的孤立对象。通过在 @OneToMany 注释上设置 orphanRemoval = true 来启用孤立删除。

处理 LazyInitializationException

在初始化集合之前访问包含延迟获取集合的实体时,会发生 LazyInitializationException。要解决此问题,请使用 Hibernate.initialize() 显式初始化集合,或在 @OneToMany 注释上使用 fetchType = FetchMode.EAGER 来立即加载集合。

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

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