簡體   English   中英

在Hibernate中持久保存后獲取數據庫生成的ID

[英]Get database generated ID after persist in Hibernate

我需要檢索persist()之后數據庫生成的ID。 我的實體看起來像這樣:

@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;

    ...
}

但是,在執行下一段代碼時,該實體保存在DB中,但是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();

有人可以幫我嗎?

PD:我不在乎使用Session或EntityManager,因此對它們中的任何一個都可以解決。

編輯:

我試過在save()方法之后添加flush() ,但仍然無法正常工作:

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

我也嘗試過在commit()之后添加flush()函數,但是拋出異常,表明沒有事務處於活動狀態。

您需要添加一個

em.flush();

強制實體管理器同步數據。 然后at.getID()將返回該值。

在這里,您有一個解決方案:

實體

@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;

    ...
}

創建功能

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

如您所見,我為@GeneratedValue(strategy = GenerationType.IDENTITY)更改了@Generated批注。 我不知道它們是否代表相同的意思,但是可以。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM