De uitzondering 'id's voor deze klasse moeten handmatig worden toegewezen voordat save() wordt aangeroepen' betekent dat u de identifier-generatiestrategie van 'Assigned' gebruikt.
toegewezen laat de toepassing een identifier toewijzen aan het object voordat save() wordt aangeroepen. Dit is de standaardstrategie als er geen element is opgegeven.
Als u geen strategie definieert, wordt de slaapstand standaard ingesteld op 'toegewezen'. 'toegewezen' strategie houdt in dat hibernate verwacht dat de applicatie zijn eigen id's levert.
Als u een sequentie-id-generator in Oracle wilt gebruiken, kunt u dit doen met de volgende configuratie -
Als u xml -
. gebruikt <id name="countryId" type="java.lang.Integer">
<column name="Country_Id" />
<generator class="sequence">
<param name="sequence">Country_Id_Seq</param>
</generator>
</id>
Als u annotaties gebruikt -
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="Country_Id_Seq")
@SequenceGenerator(name="Country_Id_Seq", sequenceName="Country_Id_Seq" )
private Integer sequence;
En je code zou er zo uit moeten zien -
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());
Wanneer 'session.save(c)' wordt uitgevoerd, doet hibernate de volgende sql-aanroep naar Oracle, haalt de id op en stelt deze in in Country-object.
select Country_Id_Seq.nextVal from dual;
Probleem met trigger
Aangezien u een trigger gebruikt om de id te verhogen wanneer een rij wordt ingevoegd, veroorzaakt dit een probleem met de slaapstand. Hibernate gebruikt de reeks om een id te genereren en de database gebruikt de trigger om de id te verhogen. Dit heeft tot gevolg dat de id twee keer wordt verhoogd.
Je hebt drie opties om dit op te lossen.
-
Verwijder de trigger omdat dit niet nodig is.
-
Als u de trigger nog steeds nodig hebt omdat de tabel buiten de toepassing kan worden bijgewerkt, kunt u de trigger zodanig bijwerken dat de id alleen wordt gegenereerd als de id niet is ingesteld in de insert statement.Hibernate probleem met Oracle Trigger voor het genereren van id uit een reeks
-
Maak een aangepaste id-generator die de trigger gebruikt om de id in de gegevens in te stellen voordat deze wordt opgeslagen in db. Bekijk de volgende link - https://forum.hibernate.org/viewtopic.php?t=973262