Возможно, это не простой способ сделать это, поскольку весь смысл дизайна EJB заключается в том, что вас не волнуют такие вещи. Первая ошибка внутри транзакции делает ее недействительной -> откат. Это правило.
Если вы хотите что-то особенное, тогда получите соединение с базой данных из сеанса и используйте простой SQL вместо EJB для изменения данных. Таким образом, вы можете попробовать INSERT
новый экземпляр и самостоятельно обрабатывать все исключения. Когда вставка будет успешной, вы можете использовать EJB для загрузки вновь созданного объекта, чтобы добавить его в сеанс.
Тем не менее, я не уверен, чего вы пытаетесь достичь с помощью приведенного выше кода. Просто игнорируя, когда вы не можете создать новый экземпляр в базе данных, похоже, что «я не забочусь о качестве моего продукта». Возможно, ваша попытка обойти ошибку - это всего лишь симптом плохой конструкции вашего приложения. Сделайте шаг назад и подумайте, что вы делаете и почему. Возможно, если вы расскажете нам больше о причинах, по которым вы хотите игнорировать все ошибки (даже действительно, действительно смертельно), мы сможем указать лучшее решение.
EDIT Итак, вы получаете javax.persistence.EntityExistsException
, что означает, что вы пытались сохранить одно и то же лицо дважды. Это может означать любое количество вещей:
- Вы загрузили компонент в другую сессию, и теперь вы пытаетесь сохранить его во втором. Поскольку новый сеанс не знает, существует ли компонент, он пытается его снова создать.
- Вместо загрузки компонента из сеанса, как и вы, вы обманули и создали новый экземпляр вручную. Конечно, менеджер сеансов теперь считает, что это новый компонент.
Правильное решение зависит от того, что вам нужно достичь. Если вы изменили myEntity
и вам необходимо сохранить изменения, используйте em.merge()
. Затем EM проверяет, существует ли объект и если он это делает, он будет делать SQL UPDATE
вместо INSERT
Если вы просто хотите присвоить какой-либо другой класс действительной сущности, то вам нужно получить его из база данных. Если база данных возвращает null, вам нужно создать новый экземпляр и сохранить его, а затем вернуть.
Смотрите также: JPA EntityManager: Why use persist() over merge()?
будет догадаться, что это без гражданства фасоли, как вы называете это? –
Это состояние Бин. – Kikou
Я определяю для EntityManager: \t @PersistenceContext (unitName = "sicb-tracabilite-business", type = PersistenceContextType.EXTENDED, properties = @PersistenceProperty (name = "org.hibernate.flushMode", value = "MANUAL")) \t защищенный EntityManager em; – Kikou