Работа primary key и hibernate при исключениях

Учу связь one-to-one на примере однонаправленных отношений. Есть два java-класса (Employee и Details). У обоих классов в таблице есть поле id (primary key для Employee и foreign key для Details). Я создала объекты этих классов, соединила их через сеттер, и добавила основной объект в базу:

    Employee emp = new Employee("Ivan", "Ivanov", "IT", 500);
    Details detail = new Detail("Omsk", "+7000000");
    emp.setEmpDetail(detail);
    session.beginTransaction();
    session.save(emp);
    session.getTransaction().commit();

Т.к. в классе Employee я не прописала каскад для аннотации @OneToOne, то вылетел эксшепшн и объекты в базу не добавились. После того, как я подправила код и прописала каскад, все заработало, однако primary key для объекта emp был равен 2 вместо 1. Подскажите, почему так вышло и можно ли прописать код для актуализации primary key на случай исключительных ситуаций (к примеру, если объект не был создан, то вычесть единицу)?


Ответы (1 шт):

Автор решения: had0uken

Если я правильно понял, то у вас так вышло, потому что у вас исключение выскочило до вашего коммита и соответственно сессия не закрылась. Для предотвращения подобных ситуаций рекомендую оборачивать данный код в try-catch-finally блоки. И в блоке finally закрывать сессию. В таком случае вы исключите подобную ситуацию, так как даже в случае экзепшена, ваш finally блок отработает и закроет сессию. При добавлении нового работника, ваш primary key должен актуализироваться. Если не прав, заранее прошу прощения и надеюсь меня более опытные ребята подправят, потому что я сам как раз на этом месте прохожу Спринг)

→ Ссылка