在hibernate中一对一关系的情况下,我们可以看到在单向和双向i的情况下输出表存在差异,只有一个表在单向和两个表中都有与其关联的外键在双向的情况下有外键。但我看不出多对多单向和双向输出表有什么区别。请问有人可以帮助我吗?感谢。
答案 0 :(得分:0)
实际上,使用多对多单向和双向时的表数是相同的。主要的不同是当你使用双向的时,你可以获得列表或设置双方的对象。使用单向,您只需从代码中获取。让我们看一个书和作者的例子。一本书有很多作者,作者可以写很多书。在示例中,我使用Set但您可以使用List。这也没关系。让我们看一下单向映射的映射:
@Entity
public class Author
{
private Long authorId;
private String authorName;
private Date dateOfBirth;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long getAuthorId()
{
return authorId;
}
public void setAuthorId(Long authorId)
{
this.authorId = authorId;
}
@Column(name="author_name")
public String getAuthorName()
{
return authorName;
}
public void setAuthorName(String authorName)
{
this.authorName = authorName;
}
/**
* @return the dateOfBirth
*/
public Date getDateOfBirth() {
return dateOfBirth;
}
/**
* @param dateOfBirth the dateOfBirth to set
*/
public void setDateOfBirth(Date dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
}
@Entity
public class Book
{
private Long bookId;
private String bookTitle;
private List<Author> authors;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long getBookId()
{
return bookId;
}
public void setBookId(Long bookId)
{
this.bookId = bookId;
}
@Column(name="book_title")
public String getBookTitle()
{
return bookTitle;
}
public void setBookTitle(String bookTitle)
{
this.bookTitle = bookTitle;
}
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="author_book", joinColumns=@JoinColumn(name="book_id"), inverseJoinColumns=@JoinColumn(name="author_id"))
public List<Author> getAuthors()
{
return authors;
}
public void setAuthors(List<Author> authors)
{
this.authors = authors;
}
}
您可以看到第三个表创建了author_book,其中包含两个表和作者的两个键。因此,使用Unidirectional,作者列表只能从Book获取。使用双向,您可以从作者访问图书并从图书访问作者。 Book对象映射应该相同。作者看起来有点不同,如:
@Entity
public class Author
{
private Set<Book> books;
/**
* @return the books
*/
public Set<Book> getBooks() {
return books;
}
/**
* @param books the books to set
*/
public void setBooks(Set<Book> books) {
this.books = books;
}
//the rest is the same code like above
...
}
希望你能清楚!