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.
-
Exclua o gatilho porque não é necessário.
-
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
-
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