gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:51:39 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com