JPA EntityManager persist() приводит к тому, что объект кажется отсоединенным, хотя была брошена ошибка

Здравствуйте У меня есть простой DAO с нижеприведенной функцией.

    public element createElement(Element e){

    em.persist(e);
    em.flush();

    return e;
}

Таблица Entity имеет уникальное ограничение на пару (тип,значение) и у меня есть тест ниже:

    public void testCreateElement() throws DataAccessException {
        // Start with empty Element table

        Element e = new Element();
        e.setType(myType.OTHER);
        e.setValue("1");
        dao.createElement(e);

        e = new Element();
        e.setType(MyType.OTHER);
        e.setValue("1");
        try{
                // this should violate unique constraint of database.
                dao.createElement(e);
        } catch (Exception ex) {
            System.out.println(ex);
        }

        e.setValue("2");
        try{
            // I expect this to work as there is no element with these values.
            dao.createElement(e);
        } catch (Exception ex) {
            System.out.println(ex);
        }
    }

Моя первая пойманная ошибка происходит, как я ожидаю, поскольку я знаю, что я нарушаю ограничение, вторая попытка/ловля не должна бросать ошибку, насколько я понимаю, но она бросает, и я получаю следующее:

javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.mypackage.Element

Похоже, что вызов persist() на "e", хотя он не был сохранен, заставил hibernate думать, что это отделенная сущность.

Это раздражает, потому что эти функции используются фронт-эндом JSF, который работает с исключением ConstraintViolation, но намеренно удерживает объект, чтобы пользователь мог изменить одно из полей и попробовать снова, а он получает ошибку detached entity.

Является ли такое поведение ошибкой hibernate, потому что я не думаю, что он должен делать это на самом деле? Есть ли способ обойти это на уровне DAO, чтобы persist не считал мой объект отсоединенным, если он на самом деле не сохраняется?

С уважением,

Glen x

6
задан Link19 24 February 2012 в 16:37
поделиться