2014-09-29 4 views
0

Когда программа сталкивается с исключением, RollBackOnly переходит в значение True.Есть ли способ заставить транзакционный откат при возникновении исключения?

Как я могу «установить» этот RollBack To False Даже если он сталкивается с исключением.

@Resource 
protected SessionContext context; 

Public void creerNewEntity(final Entity myEntity) { 
try { 
    this.em.persist(myEntity); 
    this.em.flush(); 

    } catch (final EntityExistsException e) { 
     System.out.println((this.context.getRollbackOnly())); // It s has a true value 
     throw new MyException("TODO BLABLA", e); 
    } 
} 

Когда программа бросить это исключение «MyException», изменить объект myEntity, установив, например, новый Id, то я перезвоню creerNewEntity().

К сожалению, это не сработало, я получил это исключение «javax.persistence.PersistenceException: org.hibernate.HibernateException: proxy handle is no longer valid», я думаю, потому что RollBack имеет истинное значение. Как изменить откат, чтобы это сработало?

Спасибо.

+0

будет догадаться, что это без гражданства фасоли, как вы называете это? –

+0

Это состояние Бин. – Kikou

+0

Я определяю для EntityManager: \t @PersistenceContext (unitName = "sicb-tracabilite-business", type = PersistenceContextType.EXTENDED, properties = @PersistenceProperty (name = "org.hibernate.flushMode", value = "MANUAL")) \t защищенный EntityManager em; – Kikou

ответ

2

Возможно, это не простой способ сделать это, поскольку весь смысл дизайна EJB заключается в том, что вас не волнуют такие вещи. Первая ошибка внутри транзакции делает ее недействительной -> откат. Это правило.

Если вы хотите что-то особенное, тогда получите соединение с базой данных из сеанса и используйте простой SQL вместо EJB для изменения данных. Таким образом, вы можете попробовать INSERT новый экземпляр и самостоятельно обрабатывать все исключения. Когда вставка будет успешной, вы можете использовать EJB для загрузки вновь созданного объекта, чтобы добавить его в сеанс.

Тем не менее, я не уверен, чего вы пытаетесь достичь с помощью приведенного выше кода. Просто игнорируя, когда вы не можете создать новый экземпляр в базе данных, похоже, что «я не забочусь о качестве моего продукта». Возможно, ваша попытка обойти ошибку - это всего лишь симптом плохой конструкции вашего приложения. Сделайте шаг назад и подумайте, что вы делаете и почему. Возможно, если вы расскажете нам больше о причинах, по которым вы хотите игнорировать все ошибки (даже действительно, действительно смертельно), мы сможем указать лучшее решение.

EDIT Итак, вы получаете javax.persistence.EntityExistsException, что означает, что вы пытались сохранить одно и то же лицо дважды. Это может означать любое количество вещей:

  1. Вы загрузили компонент в другую сессию, и теперь вы пытаетесь сохранить его во втором. Поскольку новый сеанс не знает, существует ли компонент, он пытается его снова создать.
  2. Вместо загрузки компонента из сеанса, как и вы, вы обманули и создали новый экземпляр вручную. Конечно, менеджер сеансов теперь считает, что это новый компонент.

Правильное решение зависит от того, что вам нужно достичь. Если вы изменили myEntity и вам необходимо сохранить изменения, используйте em.merge(). Затем EM проверяет, существует ли объект и если он это делает, он будет делать SQL UPDATE вместо INSERT

Если вы просто хотите присвоить какой-либо другой класс действительной сущности, то вам нужно получить его из база данных. Если база данных возвращает null, вам нужно создать новый экземпляр и сохранить его, а затем вернуть.

Смотрите также: JPA EntityManager: Why use persist() over merge()?

0

EntityExistsException является PersistenceException

когда JPA бросает, EJB CMT помечена для отката

http://piotrnowicki.com/2013/03/jpa-and-cmt-why-catching-persistence-exception-is-not-enough/

, как предложил Арон, вы могли бы использовать merge()

вы также можете содержать транса граница фикция с помощью RequiresNew

@TransactionAttribute(REQUIRES_NEW) 

http://docs.oracle.com/javaee/6/tutorial/doc/bncij.html

+0

Я попытался использовать "@TransactionAttribute (REQUIRES_NEW)" над моим методом, но он не работает, я получил "Caused by: org .hibernate.HibernateException: дескриптор прокси-сервера больше не действителен ", я буду следовать комментариям, сделанным Aeron. thxs – Kikou

+0

@Kikou: http://stackoverflow.com/questions/14621801/hibernateexception-proxy-handle-is-no-longer-valid-after-database-violation-err –

Смежные вопросы