Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Não é possível recuperar o id da última linha inserida no Hibernate usando Oracle


A exceção 'ids para esta classe devem ser atribuídos manualmente antes de chamar save()' significa que você está usando a estratégia de geração de identificador de 'Assigned'.

atribuído permite que o aplicativo atribua um identificador ao objeto antes que save() seja chamado. Esta é a estratégia padrão se nenhum elemento for especificado.

Se você não definir nenhuma estratégia, o padrão de hibernação será 'atribuído'. A estratégia 'atribuída' implica que o hibernate espera que o aplicativo forneça seus próprios ids.

Se você quiser usar um gerador de ID de sequência no Oracle, poderá fazê-lo com a seguinte configuração -

Se você estiver usando xml -
   <id name="countryId" type="java.lang.Integer">  
        <column name="Country_Id" />  
        <generator class="sequence">  
            <param name="sequence">Country_Id_Seq</param>               
        </generator>  
    </id>

Se você estiver usando anotações -
   @Id
   @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="Country_Id_Seq")
   @SequenceGenerator(name="Country_Id_Seq", sequenceName="Country_Id_Seq"  )
   private Integer sequence;

E seu código deve ficar assim -
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()); 

Quando 'session.save(c)' é executado, o hibernate faz a seguinte chamada sql para Oracle, recupera o id e o define no objeto Country.
select Country_Id_Seq.nextVal from dual;

Problema com o acionador

Como você está usando um gatilho para incrementar o id quando uma linha é inserida, isso causará um problema com a sequência de hibernação. O Hibernate está usando a sequência para gerar um id e o banco de dados está usando o gatilho para incrementar o id. Isso está resultando no id sendo incrementado duas vezes.

Você tem três opções para resolver isso.

  1. Exclua o gatilho porque não é necessário.

  2. Se você ainda precisar do gatilho porque a tabela pode ser atualizada fora do aplicativo, você pode atualizar o gatilho de forma que o id seja gerado apenas se o id não estiver definido na instrução de inserção Problema de hibernação com o Oracle Trigger para gerar id de uma sequência

  3. Crie um gerador de id personalizado que use o gatilho para definir o id nos dados antes de salvá-lo no db. Confira o link a seguir - https://forum.hibernate.org/viewtopic.php?t=973262