Hibernate双向一对多映射

2023-05-15 15:02:16 浏览数 (4)

双向一对多映射是Hibernate中常见的关系映射之一。在这种映射中,两个实体类之间存在一个一对多的关系,其中一个实体类作为“一”的一方,另一个实体类作为“多”的一方。

在双向一对多映射中,需要在两个实体类之间建立双向关联。假设我们有两个实体类:一个是主实体类(One)和一个从实体类(Many)。主实体类(One)有多个从实体类(Many)的引用,而从实体类(Many)只有一个主实体类(One)的引用。

首先,我们需要在主实体类(One)中创建一个集合来存储从实体类(Many)的引用。这可以通过使用@OneToMany注解来实现。同时,我们需要使用@JoinColumn注解来指定外键列的名称。

代码语言:javascript复制
@Entity
public class One {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "one")
    private List<Many> manyList;

    // 构造函数、getter和setter方法
}

接下来,在从实体类(Many)中,我们需要创建一个主实体类(One)的引用,并使用@ManyToOne注解来建立多对一关系。

代码语言:javascript复制
@Entity
public class Many {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "one_id")
    private One one;

    // 构造函数、getter和setter方法
}

在上述代码中,name属性用于指定外键列的名称,这里我们使用"one_id"作为外键列的名称。这样,我们就建立了主实体类(One)和从实体类(Many)之间的双向一对多关系。

接下来,我们将给出一个示例来说明如何使用双向一对多映射。假设我们有一个图书(Book)和一个作者(Author)的实体类,一个作者可以写多本书,而一本书只能有一个作者。

首先,我们创建Author实体类:

代码语言:javascript复制
@Entity
public class Author {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @OneToMany(mappedBy = "author")
    private List<Book> books;

    // 构造函数、getter和setter方法
}

然后,我们创建Book实体类:

代码语言:javascript复制
@Entity
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;

    @ManyToOne
    @JoinColumn(name = "author_id")
    private Author author;

    // 构造函数、getter和setter方法
}

在上述示例中,Author实体类拥有一个名为books的集合,用于存储该作者写的所有书籍。Book实体类拥有一个名为author的Author对象引用,用于表示该书籍的作者。

通过以上的双向一对多映射,我们可以轻松地进行关系操作。例如,我们可以创建一个作者和几本书的示例并进行保存:

代码语言:javascript复制
Author author = new Author("John Smith");
Book book1 = new Book("Book 1", author);
Book book2 = new Book("Book 2", author);

author.getBooks().add(book1);
author.getBooks().add(book2);

session.save(author);
session.save(book1);
session.save(book2);

在上述示例中,我们创建了一个名为John Smith的作者对象,并创建了两本书(Book 1和Book 2)并将它们与该作者关联起来。通过调用作者对象的getBooks()方法,我们可以获取该作者写的所有书籍,并通过add()方法将书籍添加到集合中。

最后,通过调用session.save()方法,我们将作者对象和书籍对象保存到数据库中。

0 人点赞