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自动创建?如何自动创建?
使用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)