双向一对多映射是Hibernate中常见的关系映射之一。在这种映射中,两个实体类之间存在一个一对多的关系,其中一个实体类作为“一”的一方,另一个实体类作为“多”的一方。
在双向一对多映射中,需要在两个实体类之间建立双向关联。假设我们有两个实体类:一个是主实体类(One)和一个从实体类(Many)。主实体类(One)有多个从实体类(Many)的引用,而从实体类(Many)只有一个主实体类(One)的引用。
首先,我们需要在主实体类(One)中创建一个集合来存储从实体类(Many)的引用。这可以通过使用@OneToMany
注解来实现。同时,我们需要使用@JoinColumn
注解来指定外键列的名称。
@Entity
public class One {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "one")
private List<Many> manyList;
// 构造函数、getter和setter方法
}
接下来,在从实体类(Many)中,我们需要创建一个主实体类(One)的引用,并使用@ManyToOne
注解来建立多对一关系。
@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()
方法,我们将作者对象和书籍对象保存到数据库中。