Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Nie można pobrać identyfikatora ostatniego wstawionego wiersza w Hibernate za pomocą Oracle

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.

  1. Usuń wyzwalacz, ponieważ nie jest to konieczne.

  2. 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

  3. 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wykrywanie przyrostowych zmian w bazie danych (od Oracle do MongoDB ETL)

  2. Jaka jest domyślna precyzja i skala liczby w Oracle?

  3. Jak uzyskać ostatni identyfikator insertu w Oracle za pomocą MyBatis?

  4. Różnica między notacją Oracle plus (+) a notacją ansi JOIN?

  5. ORA-12728:nieprawidłowy zakres w wyrażeniu regularnym