У меня есть следующий вариант использования, когда я получаю сообщение через JMS, касающееся сущности, через уникальное свойство (не PK), и мне требуется обновить состояние сущности:
HibernateUtil.beginSession();
HibernateUtil.beginTransaction();
try{
Entity entity = dao.getEntityByUniqueProperty(propertyValue);
if (entity==null){
entity = dao.addEntityByUniqueProperty(propertyValue)
}
entity.setSomeProperty(otherPropertyValue);
HibernateUtil.commitTransaction();
} catch (ConstraintViolationException e){
HibernateUtil.rollbackTransaction();
//Do other things additionally
} catch (StaleStateObjectException e){
HibernateUtil.rollbackTransaction();
//Do other things additionally
} finally {
HibernateUtil.closeSession();
}
В этом случае использования я должен быть готов к тому, что сущность, которую я пытаюсь обновить, еще не создана, и поэтому я прошу, чтобы такая сущность была создана (шаблон этого должен быть точным с уникальным свойством ) а потом меняю это.
Моя дилемма выглядит следующим образом:
С одной стороны, у меня есть два совершенно разных блока, и я должен использовать различные предложения catch, где это уместно, НО рассматривается как конечный случай, когда сущность отсутствует, когда я запрашиваю, но есть ли мс позже, когда я пытаюсь ее создать (отсюда ConstraintViolationException ) - это то, что не должно происходить слишком часто, и вставка из-за этого дополнительная фиксация / beginTransaction в середине кажется просто неэффективной.
Я в основном обеспокоен дополнительным ударом по производительности при синхронизации сеанса и соединении JDBC, которые выполняются, когда происходит фиксация / начало.
Я ошибся? Я ищу оптимизацию там, где не должен? Я что-то упустил?
Заранее спасибо