我在 JPA 项目中有 2 个实体:
一个类别和一个问题。所以每个类别都有一个问题列表,每个问题都是一个类别的一部分(OnetoMany 关系)。我通过两个实体中的设置/添加方法管理双向关系:
问题 :
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "Qcategory")
private Category category;
public void setCategory(Category category) {
this.category = category;
if (category != null && !category.getQuestions().contains(this)) {
category.addQuestion(this);
}
}
类别 :
@OneToMany(cascade = { CascadeType.ALL }, mappedBy = "category")
private List<Question> questions= new ArrayList<Question>();
public void addQuestion(Question question) {
this.questions.add(question);
if (question.getCategory() != this) {
question.setCategory(this);
}
}
我首先创建一个类别。
Category category1 = new Category();
category1.setName = "exampleCategory";
我通过我的存储库将其添加到数据库中(以与问题 addOrUpdate 类似的方式添加,如下所示)
之后我创建一个问题
Question question1 = new Question();
我将问题的类别设置为 category1
question.setCategory = category1;
在此之后,我还尝试通过调用下面的 addOrUpdate 方法将问题持久化到数据库。然后我得到一个错误:
....:javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: jpa.entities.Category
我使用如下存储库方法:
@Override
public boolean addOrUpdate(Question question) {
EntityManagerFactory emf = JPARepositoryFactory
.getEntityManagerFactory();
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Question tempQuestion = null;
try {
if (question.getId() != null) {
tempQuestion = em.find(Question.class,
question.getId());
}
if (tempQuestion == null) {
em.persist(question);
} else {
tempQuestion .setCategory(question.getCategory());
... (other setters)
tempQuestion = em.merge(question);
}
} catch (Exception e) {
....logging... }
tx.commit();
em.close();
emf.close();
return true;
}
任何建议都会更受欢迎。