sql >> Databáze >  >> RDS >> Oracle

Nelze načíst ID posledního vloženého řádku v režimu spánku pomocí Oracle

Výjimka 'ID pro tuto třídu musí být ručně přiřazena před voláním save()' znamená, že používáte strategii generování identifikátorů 'Assigned'.

přiděleno umožňuje aplikaci přiřadit objektu identifikátor před voláním save(). Toto je výchozí strategie, pokud není zadán žádný prvek.

Pokud nedefinujete žádnou strategii, hibernace je výchozí 'přiřazeno'. Strategie „přiřazeno“ znamená, že hibernace očekává, že aplikace dodá svá vlastní ID.

Pokud chcete použít generátor id sekvence v Oracle, můžete tak učinit pomocí následující konfigurace -

Pokud používáte xml -

   <id name="countryId" type="java.lang.Integer">  
        <column name="Country_Id" />  
        <generator class="sequence">  
            <param name="sequence">Country_Id_Seq</param>               
        </generator>  
    </id>

Pokud používáte anotace -

   @Id
   @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="Country_Id_Seq")
   @SequenceGenerator(name="Country_Id_Seq", sequenceName="Country_Id_Seq"  )
   private Integer sequence;

A váš kód by měl vypadat takto -

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()); 

Když se 'session.save(c)' spustí, hibernace provede následující volání SQL do Oracle, načte id a nastaví ho do objektu Země.

select Country_Id_Seq.nextVal from dual;

Problém se spouštěčem

Protože ke zvýšení id při vložení řádku používáte spouštěč, způsobí to problém se sekvencí hibernace. Hibernate používá sekvenci ke generování id a databáze používá spouštěč ke zvýšení id. To má za následek, že se id zvýší dvakrát.

Máte tři možnosti, jak to vyřešit.

  1. Smažte spoušť, protože to není nutné.

  2. Pokud stále potřebujete spouštěč, protože tabulku lze aktualizovat mimo aplikaci, můžete spouštěč aktualizovat tak, aby se id vygenerovalo pouze v případě, že id není nastaveno v příkazu insertHibernate problém s Oracle Trigger pro generování id ze sekvence

  3. Vytvořte vlastní generátor id, který použije spouštěč k nastavení id v datech před jejich uložením do db. Podívejte se na následující odkaz - https://forum.hibernate.org/viewtopic.php?t=973262



  1. connect ECONNREFUSED - node js , sql

  2. Nelze se připojit k MySQL z Java:NullPointerException uvnitř logiky připojení ovladače MySQL

  3. Použijte TYPE_ID() k získání ID datového typu na serveru SQL Server

  4. Jak Round() funguje v PostgreSQL