JPA аннотация для условного обновления - PullRequest
1 голос
/ 09 февраля 2020

У меня есть две сущности

@Entity
@Table(name = "question", uniqueConstraints =
    @UniqueConstraint(columnNames = "text"))
public class Question  implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    private String text;
    @OneToMany(mappedBy = "question", cascade = CascadeType.ALL, orphanRemoval = true, targetEntity = Answer.class)
    private Set<Answer> listAnswers = new HashSet<Answer>();
}


@Entity
public class Answer  implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    private String text;
    private Integer result = 0;

    @ManyToOne(targetEntity = Question.class, cascade = CascadeType.MERGE)
    @JoinColumn(name = "question_id", nullable = false)
    private Question question;
}

Когда я пытаюсь объединить () сущность, вопрос все данные в ответе перезаписать ("hibernate.hbm2ddl.auto" = "update"):

    EntityManagerFactory emf = Persistence.createEntityManagerFactory(
            "some.package.settings", properties);
    assertTrue(emf.isOpen());
    EntityManager em  = emf.createEntityManager();

    em.getTransaction().begin();

    em.merge(question);

    if (em.getTransaction().isActive()) {
        em.getTransaction().commit();
    }
    em.close();
    emf.close();

В поле ответа объекта Entity есть значения: 0, 1, 2. Мне нужно запретить обновление записи, если Answer.result> 0.

Есть такая аннотация или нет? Я видел аннотации @ PreUpdate / @ PostUpdate. А может сохранять данные перед обновлением и восстанавливать при необходимости, но может существовать другим способом?

1 Ответ

0 голосов
/ 09 февраля 2020

Моя программа анализирует тот же ресурс и генерирует список вопросов с ответами. Мне нужно проверить запись вопроса с ответами в БД. Если вопрос присутствует, я добавляю только ответы. Если ответ на вопрос также присутствует, мне нужно обновить поле Answer.result в значении == 0.

public void testAnswersForQuestion() {

    Integer resultAnswer = question.getListAnswers().get(0).getResult();
    System.out.println("ans1 result: " + ans1.getResult());
    System.out.println("question answer result: " + resultAnswer);
    assertTrue(question.getListAnswers().size()>0);
    assertTrue(question.getListAnswers().size()==1);
    assertTrue(resultAnswer == 2);

    ans1.setResult(0);
    assertTrue(ans1.getResult()==0);

    System.out.println("----ADD ANSWER----");
    question.getListAnswersAsSet().add(ans1);
    assertTrue(question.getListAnswers().size()==1);
    resultAnswer = question.getListAnswers().get(0).getResult();
    assertTrue(resultAnswer == 0);

    System.out.println("----AFTER----");

    System.out.println("ans1 result: " + ans1.getResult());
    System.out.println("question answer result: " + resultAnswer);
}

Все тесты пройдены. Вывод:

ans1 result: 2
question answer result: 2
----ADD ANSWER----
----AFTER----
ans1 result: 0
question answer result: 0

Как видите, результат поля был изменен. Мне нужно запретить обновление записи, если Answer.result> 0.

...