Wyjątek „identyfikatory dla tej klasy muszą być przypisane ręcznie przed wywołaniem funkcji save()” oznacza, że używasz strategii generowania identyfikatorów „Przypisane”.
przypisane pozwala aplikacji przypisać identyfikator do obiektu przed wywołaniem funkcji save(). Jest to strategia domyślna, jeśli nie określono żadnego elementu.
Jeśli nie zdefiniujesz żadnej strategii, hibernacja domyślnie ustawiona jest na „przypisane”. Strategia „przypisana” oznacza, że hibernacja oczekuje, że aplikacja dostarczy własne identyfikatory.
Jeśli chcesz użyć generatora identyfikatorów sekwencji w Oracle, możesz to zrobić za pomocą następującej konfiguracji -
Jeśli używasz xml -
<id name="countryId" type="java.lang.Integer">
<column name="Country_Id" />
<generator class="sequence">
<param name="sequence">Country_Id_Seq</param>
</generator>
</id>
Jeśli używasz adnotacji —
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="Country_Id_Seq")
@SequenceGenerator(name="Country_Id_Seq", sequenceName="Country_Id_Seq" )
private Integer sequence;
Twój kod powinien wyglądać tak -
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());
Po wykonaniu 'session.save(c)' hibernate wykonuje następujące wywołanie sql do Oracle, pobiera identyfikator i ustawia go w obiekcie Country.
select Country_Id_Seq.nextVal from dual;
Problem z wyzwalaczem
Ponieważ używasz wyzwalacza do zwiększania identyfikatora po wstawieniu wiersza, spowoduje to problem z sekwencją hibernacji. Hibernate używa sekwencji do generowania identyfikatora, a baza danych używa wyzwalacza do zwiększania identyfikatora. Powoduje to dwukrotne zwiększenie identyfikatora.
Masz trzy możliwości rozwiązania tego problemu.
-
Usuń wyzwalacz, ponieważ nie jest to konieczne.
-
Jeśli nadal potrzebujesz wyzwalacza, ponieważ tabela może zostać zaktualizowana poza aplikacją, możesz zaktualizować wyzwalacz w taki sposób, aby identyfikator był generowany tylko wtedy, gdy identyfikator nie jest ustawiony w instrukcji insert. Problem Hibernate z wyzwalaczem Oracle do generowania identyfikatora z sekwencji
-
Utwórz niestandardowy generator identyfikatorów, który używa wyzwalacza do ustawiania identyfikatora w danych przed jego zapisaniem w db. Sprawdź poniższy link - https://forum.hibernate.org/viewtopic.php?t=973262