Java for Web学习笔记(一二九)映射(5)ManyToMany

本文详细介绍了在数据库设计中如何使用ManyToMany关系,并通过具体的例子解释了如何创建中间表来关联两个实体,同时还提供了单向及双向ManyToMany关系的Java实体类实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ManyToMany需要中间表格。

小例子

一本书可以有N个作者,一个作者可以有N本书。

CREATE TABLE `Book` (
  `Id` bigint(20) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `BookName` varchar(50) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB;

CREATE TABLE `Author` (
  `Id` bigint(20) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `AuthorName` varchar(50) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB;

-- 通过Book_Author表格实现书和作者的关联
CREATE TABLE `Book_Author` (
  `Id` bigint(20) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `Book_Id` bigint(20) unsigned NOT NULL,
  `Author_Id` bigint(20) unsigned NOT NULL,
  CONSTRAINT `BOOK_AUTHOR_BOOK_ID` FOREIGN KEY (`Book_Id`) REFERENCES `Book` (`Id`) ON DELETE CASCADE,
  CONSTRAINT `BOOK_AUTHOR_AUTHOR_ID` FOREIGN KEY (`Author_Id`) REFERENCES `Author` (`Id`) ON DELETE CASCADE
) ENGINE=InnoDB

Author的单向ManyToMany

@Entity
public class Author {
    private long id;
    private String authorName;
    private List<Book> books = new ArrayList<>();

    //【1】标记ManyToMany,里面的参数同之前学习
    @ManyToMany(fetch = FetchType.LAZY)
    //【2】标记关联表格Book_Author,@JoinTable也可以通过中间关联表格的OneToMany
    @JoinTable(name = "Book_Author",
               // 2.1)本Entity(Author)的主键关联表格Book_Author中的列Author_Id(外键)
               joinColumns = {@JoinColumn(name = "Author_Id")},
               // 2.2)对端Entity(Book)的列“Id”(缺省为主键)键关联表格Book_Author中的列Book_Id(外键)
               inverseJoinColumns = {@JoinColumn(name = "Book_Id",referencedColumnName = "Id")})
    public List<Book> getBooks() { ... }
    ......
}

Book和Author的双向ManyToMany

Author的代码同上,不再重复。

@Entity
public class Book {
    ... ...
    private List<Author> authors = new ArrayList<>();

    //标记ManyToMany,对方Entity(Author)的对应属性为books
    @ManyToMany(mappedBy = "books")
    public List<Author> getAuthors() { ... }
    ... ...
}

相关链接:我的Professional Java for Web Applications相关文章

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值