JPA 2.0 EclipseLink Проверка уникальности - PullRequest
0 голосов
/ 15 апреля 2010

У меня есть уникальный столбец = true .. в классе экзамена .... Я обнаружил, что, поскольку транзакции совершаются автоматически, чтобы заставить коммит использовать em.commit ()

Однако я хотел бы знать, как проверить, является ли он уникальным. Запуск запроса не является решением, поскольку он может быть инстерт после проверки из-за параллелизма ....

Какой лучший способ проверить уникальность?

List<Exam_Normal> exam_normals = exam.getExam_Normal();
    exam.setExam_Normal(null);

    try {
        em.persist(exam);
        em.flush();

        Long i = 0L;
        if (exam_normals != null) {
            for (Exam_Normal e_n : exam_normals) {
                i++;
                e_n.setItem(i);
                e_n.setId(exam);
                em.persist(e_n);
            }
        }
    } catch (Exception e) {
        System.out.print("sfalma--");
    }
}

д

Ответы [ 3 ]

3 голосов
/ 16 апреля 2010

К сожалению, в JPA нет способа избежать отката транзакции при нарушении уникального ограничения, поскольку спецификация требует, чтобы это исключение пометило транзакцию для отката. Кроме того, поскольку строка может не существовать, когда вы выполняете вызов 'lock' с помощью API JPA 2.0, вызов 'lock' не гарантирует, что только поток блокировки может вставить объект. «Блокировка» будет препятствовать обновлению сущности, но не вставке.

Вам необходимо выполнить «постоянство», как в вашем коде, но держать его как можно ближе к началу транзакции, или операция должна выполняться в собственной транзакции.

Если «persist» должен быть частью более крупной транзакции, а сбой «persist» не препятствует успешному выполнению этой части вашего приложения, вам следует сохранить экземпляры Entity из этой транзакции, и вы сможете их «объединить» в любую последующую транзакцию, когда ваше приложение восстанавливается после отката.

1 голос
/ 15 апреля 2010

Однако я хотел бы знать, как проверить, является ли он уникальным. Выполнение запроса не является решением, потому что это может быть вставка после проверки из-за параллелизма ....

JPA 2.0 разрешает пессимистическую блокировку и добавляет для этого три режима блокировки. Это может быть вариант для вашего варианта использования.

Некоторые ссылки:

0 голосов
/ 15 апреля 2010

Я предполагаю, что столбец не является первичным ключом (@Id), и в этом случае ваше приложение должно гарантировать уникальность. Гарантия уникальности поля, вероятно, придет откуда-то еще. Какой тип значения это поле? Вот несколько идей

Если это счетчик, то вы, вероятно, можете использовать @Singleton bean-компонент с состоянием (JavaEE 6. См. this .

Если вы используете EE5, тогда bean-компонент без состояния с @Entity сопоставляется с автоматически сгенерированным ключом.

...