Изключението „идентификаторите за този клас трябва да бъдат присвоени ръчно, преди да се извика save()“ означава, че използвате стратегията за генериране на идентификатор на „Assigned“.
назначени позволява на приложението да присвои идентификатор на обекта, преди да бъде извикано save(). Това е стратегията по подразбиране, ако не е посочен елемент.
Ако не дефинирате никаква стратегия, хибернацията по подразбиране е 'assigned'. Стратегията „присвоена“ предполага, че hibernate очаква приложението да предостави собствените си идентификатори.
Ако искате да използвате генератор на идентификатори на последователност в Oracle, можете да го направите със следната конфигурация -
Ако използвате xml -
<id name="countryId" type="java.lang.Integer">
<column name="Country_Id" />
<generator class="sequence">
<param name="sequence">Country_Id_Seq</param>
</generator>
</id>
Ако използвате пояснения -
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="Country_Id_Seq")
@SequenceGenerator(name="Country_Id_Seq", sequenceName="Country_Id_Seq" )
private Integer sequence;
И вашият код трябва да изглежда така -
Country c=new Country();
c.setCountryName(request.getParameter("txtCountryName"));
c.setCountryCode(request.getParameter("txtCountryCode"));
Zone z=(Zone) session.get(Zone.class, new BigDecimal(request.getParameter("zoneId")));
c.setZone(z);
session.save(c);
session.flush();
System.out.println(c.getCountryId());
Когато 'session.save(c)' се изпълни, hibernate прави следното sql извикване към Oracle, извлича идентификатора и го задава в обект Country.
select Country_Id_Seq.nextVal from dual;
Проблем със спусъка
Тъй като използвате тригер за увеличаване на идентификатора, когато се вмъкне ред, това ще доведе до проблем с последователността на хибернация. Hibernate използва последователността за генериране на идентификатор, а базата данни използва тригера за увеличаване на идентификатора. Това води до увеличаване на идентификатора два пъти.
Имате три възможности да разрешите това.
-
Изтрийте тригера, защото не е необходимо.
-
Ако все още имате нужда от тригера, тъй като таблицата може да бъде актуализирана извън приложението, можете да актуализирате тригера така, че идентификаторът да се генерира само ако идентификаторът не е зададен в инструкцията за вмъкване HIbernate проблем с Oracle Trigger за генериране на идентификатор от последователност
-
Създайте персонализиран генератор на идентификатори, който използва тригера, за да зададе идентификатора в данните, преди да бъде запазен в db. Вижте следния линк - https://forum.hibernate.org/viewtopic.php?t=973262