为什么Hibernate不为多对多关系表生成主键?

use*_*911 3 java mysql many-to-many hibernate

我有一个简单的多对多表.一个术语可以属于多个类别,一个类别可以分配给多个术语.

Term.java

@Entity
public class Term implements Serializable {

    @Id
    @GeneratedValue
    private long id;

    @NotNull
    @Size(min = 1, max = 100)
    private String name;

    @ManyToMany(mappedBy="terms")
    private List<Category> categories = new ArrayList<Category>();

    ...
    // getters and setters
}
Run Code Online (Sandbox Code Playgroud)

Category.java

@Entity
public class Category implements Serializable {

    @Id
    @GeneratedValue
    private long id;

    @NotNull
    @Size(min = 1, max = 255)
    private String name;

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    private List<Term> terms = new ArrayList<>();

   // getters and setters
}
Run Code Online (Sandbox Code Playgroud)

但是,生成的交集表""不包含主键,如下所示:

MariaDB [wordDS]>describe Category_Term;
+---------------+------------+------+-----+---------+-------+
| Field         | Type       | Null | Key | Default | Extra |
+---------------+------------+------+-----+---------+-------+
| categories_id | bigint(20) | NO   | MUL | NULL    |       |
| terms_id      | bigint(20) | NO   | MUL | NULL    |       |
+---------------+------------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)

不应该总是需要复合键作为主键,并且应该由Hibernate自动创建?如何自动创建?

Rob*_*sen 7

使用a Set而不是a List来强制唯一性.Hibernate将生成主键.

@ManyToMany(mappedBy="terms")
private Set<Category> categories = new HashSet<Category>();

/* ... */

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Set<Term> terms = new HashSet<>();
Run Code Online (Sandbox Code Playgroud)