我有一个简单的多对多表。一个 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/