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