【发布时间】:2020-03-23 12:32:12
【问题描述】:
我正在尝试以一对多的方式在 PostgreSQL 数据库中保留两个实体类别和问题(类别有很多问题,一个问题属于一个类别)。
经过大量搜索和尝试,将 CascadeType.PERSIST 添加到这两个实体是我发现的唯一解决该错误的方法,但在问题方面使用 CascadeType.PERSIST 时,类别表中将充满重复项。有没有更好的解决方案,因为表中的类别应该是唯一的。
@Entity
@Table(name = "Category")
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CID")
private int categoryId;
@Column(name = "CNAME")
private String categoryName;
@OneToMany(mappedBy = "category" , cascade = CascadeType.PERSIST)
public List<Question> questions;
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Category)) {
return false;
}
Category category = (Category) o;
return categoryId == category.categoryId
&& getCategoryName().equals(category.getCategoryName())
&& questions.equals(category.questions);
}
@Override
public int hashCode() {
return Objects.hash(getCategoryName());
}
@Entity
@Table(name = "Question" )
public class Question {
@Id
@Column(name = "QID")
private int id;
@Column(name = "QText")
private String question;
@ManyToOne()
private Category category;
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Question)) {
return false;
}
Question question = (Question) o;
return getId() == question.getId();
}
@Override
public int hashCode() {
return Objects.hash(getId());
}
public persist(){
EntityManager em = getEntityManager();
em.getTransaction().begin();
for (Category c : data.getCategories()) {
em.persist(c);
}
em.getTransaction().commit();
em.close();
}
【问题讨论】:
-
您能否就您要解决的问题向我们提供更多信息:是
IllegalStateException异常还是the category table we'll be full of duplicates。如果是后者,您能否在此声明中添加更多说明? -
类别表应该有 n 个类别,并且问题表中的每个问题都应该使用外键指向它的类别,但我得到的是一个表(类别),其中每个问题的类别再次持久化,因此类别表具有作为问题的确切行数,而不是增加 n 行,这使得表中充满了重复项,我认为这是因为级联。是不是更清楚了?
-
对我来说这不是
cascade问题:事实上cascade是JPA 的一个方便功能,可以避免在您的情况下对子实体调用persist方法Question实体和许多其他方便的任务。对于您的问题,您能否提供更多有关persist方法中的data变量的信息,您在数据库中获得的内容以及您的期望? -
persist 方法从包含许多类别的列表中获取一个类别对象(在上面的代码中)。我获得了应有的问题表和每个问题都有一行的类别表,因此它不使用问题表中的 fk (fk_categorieID)
-
所以如果我理解你的问题,在
data变量中,你可以说 5 个Category,对于每个你有 3 个Question。您期望在Category表中获得5 行,在Question表中获得15 行。但是您在每个表中获得 15 行,不是吗?
标签: java algorithm hibernate jpa persistence