Hibernate може да предизвика ConstraintViolationException
когато се опитате да вмъкнете ред, който нарушава ограничение (включително уникално ограничение). Ако не получите това изключение, може да получите някакво друго общо изключение за хибернация - зависи от версията на хибернация и способността на хибернацията да съпоставя изключението MySQL с изключение за хибернация във версията и типа база данни, която използвате ( Не съм го тествал за всичко).
Ще получите изключението само след извикване на flush()
, така че трябва да се уверите, че това също е във вашия блок try-catch.
Бих внимавал при внедряването на решения, при които първо проверявате дали редът съществува. Ако няколко сесии актуализират таблицата едновременно, можете да получите условие за състезание. Два процеса четат реда почти по едно и също време, за да видят дали съществува; и двамата откриват, че го няма, и след това и двамата се опитват да създадат нов ред. Един ще се провали в зависимост от това кой ще спечели състезанието.
По-доброто решение е първо да опитате вмъкването и ако не успее, приемете, че вече е било там. Въпреки това, след като имате изключение, ще трябва да се върнете назад, така че това ще ограничи начина, по който можете да използвате този подход.