У меня есть 2 объектов в проекте JPA:javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: ошибка
категорию и вопрос. поэтому каждая категория будет иметь список вопросов, и каждый вопрос будет частью категории (отношение OnetoMany). Я управляю отношения двунаправленную через набор/добавить methodes в обоих образованиях:
Вопрос:
@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();
Я установить категорию вопроса к категории1
question.setCategory = category1;
После этого я также пытаюсь сохранить вопрос до t он db, вызвав метод 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;
}
Любое предложение было бы более прием.
Вы когда-нибудь называли persist/merge по категории? – Pace
Вы устанавливаете значения для 'tempQuestion', но объединяете' question' или это просто опечатка. –
@Pace Не напрямую, я ставлю только отношение к категории. Но я понимаю, что также добавляю этот вопрос к списку в категории. Но я использую CascadeType.ALL для лица, у которого есть отношение. Поэтому я верю, что он это сделает. –