2016-08-09 148 views
2

Ich muss die ID abrufen, die eine Datenbank nach einer persist() generiert. Meine Einheit sieht wie folgt aus:Datenbank-generierte ID nach persistieren in Hibernate erhalten

@Entity 
@Table(name = "TableName") 
public class TableNameClass { 

    @Id 
    @Generated(GenerationTime.INSERT) 
    @Column(name = "ID", insertable = false, nullable = false, unique = true, updatable = false) 
private int ID; 

    ... 
} 

Wenn jedoch das nächste Stück Code ausgeführt wird, wird das Unternehmen in der DB gespeichert, aber das Ergebnis der System.out.println 0:

Session s = HibernateUtil.getSessionFactory().openSession(); 
TableNameClass tnc = new TableNameClass(); 
tnc.setName("SessionTest4"); 
Transaction t = s.beginTransaction(); 
s.save(tnc); 
t.commit(); 
System.out.println(tnc.getID()); 
s.close(); 

mir jemand helfen könnte, , Bitte?

PD: Ich interessiere mich nicht für die Verwendung von Session oder EntityManager, so dass eine Lösung auf einem von ihnen in Ordnung sein wird.

EDIT:

Ich habe versucht, das Hinzufügen eines flush() nach dem save() Methode, aber immer noch nicht funktioniert:

Session s = HibernateUtil.getSessionFactory().openSession(); 
AlertType at = new AlertType(); 
at.setName("SessionTest4"); 
Transaction t = s.beginTransaction(); 
s.save(at); 
s.flush(); 
t.commit();   
System.out.println(at.getID()); 
s.close(); 

Ich habe auch versucht, das Hinzufügen von flush() Funktion nach dem commit() jedoch Es wird eine Ausnahme ausgelöst, die besagt, dass keine Transaktion aktiv ist.

Antwort

1

Hier haben Sie eine Lösung:

ENTITY:

@Entity 
@Table(name = "TableName") 
public class TableNameClass { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ID", insertable = false, nullable = false, unique = true, updatable = false) 
    private int ID; 

    ... 
} 

CREATE FUNCTION

TableNameClass tnc = new TableNameClass(); 
tnc.setName("Solution"); 
Session s = HibernateUtil.getSessionFactory().openSession(); 
Transaction t = s.beginTransaction(); 
Integer myID = (Integer)s.save(tnc); 
t.commit(); 
s.close(); 
System.out.println(myID); 

Wie Sie sehen können, habe ich die @Generated Anmerkung für @GeneratedValue(strategy = GenerationType.IDENTITY) geändert haben . Ich weiß nicht, ob beide gleich sind, aber es funktioniert.

1

Sie benötigen einen

em.flush(); 

hinzuzufügen, um die Einheit Manager zu zwingen, die Daten zu synchronisieren. Dann gibt at.getID() den Wert zurück.

+0

Funktioniert immer noch nicht. Ich habe die Frage mit den Änderungen aktualisiert, die ich vorgenommen habe. Irgendeine Idee? Ich verwende Hibernate 5.2.4 Final –

+0

Das Commit schloss die Transaktion und wird nicht benötigt, wenn Sie CMP verwenden. Nimm das raus und schau, ob es funktioniert. – WPrecht

+0

Funktioniert immer noch nicht. Ich habe die persist() entfernt, aber immer noch 0 zurück. Ich habe auch versucht, indem Sie die Entität ohne eine Transaktion speichern, nach diesem Tutorial [link] (http://www.journaldev.com/3481/hibernate-session-merge -vs-update-save-saveorupdate-persist-Beispiel) und die Auto-Commit-Eigenschaft aktivieren, aber ich denke, das funktioniert nicht mehr auf der neuesten Version von Hibernate. –