在 Spring Boot/Hibernate/JPA 中为连接表指定表和字段名称

sme*_*eeb 4 many-to-many hibernate jpa spring-boot

我正在使用 MySQL 支持的 Spring Boot/JPA。我已经配置了数据库,因此计划使用hibernate.hbm2ddl.auto = validate(因此 Hibernate 不会尝试为我创建数据库,而是使用我提供的数据库并根据我在代码中定义的实体“验证”它)。

我与我的实体有几个多对多关系,例如BookAuthor

// Groovy pseudo code! One book can have multiple authors, and a
// single author can have written many books.
@Entity
class Book {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    Long id

    @Column(name="title")
    String title

    @ManyToMany
    List<Author> authors
}

@Entity
class Author {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    Long id

    @Column(name="name")
    String name

    @ManyToMany
    List<Book> books
}
Run Code Online (Sandbox Code Playgroud)

在这里,这些类由下表表示:

[books]
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT # PRIMARY KEY
title VARCHAR(50) NOT NULL

[authors]
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT # PRIMARY KEY
name VARCHAR(100) NOT NULL

[books_x_authors]
books_x_authors_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT # PRIMARY KEY
book_id    # FK on books
author_id  # FK on authors
Run Code Online (Sandbox Code Playgroud)

books_x_authors我的多对多或“人行横道”表在哪里。这是我非常喜欢并希望尽可能坚持的数据库命名约定。那么我如何配置 Spring Boot/Hibernate 以books_x_authors用作我的 join/crosswalk 表,而不是期望一个表遵守其自己的约定?

Ame*_*bsa 7

在您的 ManyToMany 下指定包含您需要的所有内容的连接表

 @ManyToMany
@JoinTable(name="books_x_authors",
 joinColumns={@JoinColumn(name="author_id"}, inverseJoinColumns={@JoinColumn(name="book_id")} )
List<Book> books
Run Code Online (Sandbox Code Playgroud)

  • 如果您知道作者是这种关系中的拥有实体,那么您只需要将 @ManyToMany(mappedBy="books") 放在您的图书类中,无需进一步配置。如果答案解决了您的问题,请接受它作为答案:) (2认同)