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

标签 java mysql hibernate many-to-many

我有一个简单的多对多表。一个 Term 可以属于多个 Categories,一个 Category 可以分配给多个 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
}

分类.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
}

然而,生成的交集表“”不包含主键,从这里可以看出:

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    |       |
+---------------+------------+------+-----+---------+-------+

复合键不应该总是需要作为主键,并且应该由 Hibernate 自动创建吗?我怎样才能自动创建它?

最佳答案

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

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

/* ... */

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

关于java - 为什么 Hibernate 不为多对多关系表生成主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36213270/

相关文章:

java - 没有外键但有反向外键的 hibernate 多对一关系

java - Spring Batch-MySQL问题

mouseevent - mouseReleased 和 mouseClicked 之间的区别

java - 有效的 Json 抛出 "Expected BEGIN_OBJECT but was STRING at line 1 column 4"

mysql - 组合两个选择查询

MySQL Escape查询结果中的双引号

java - org.springframework.dao.DataIntegrityViolationException 误报原因?

java - 最简单的 NIO 服务器示例

java - Android - Conceal Facebook 登录按钮

mysql - SQL 多连接整理