我需要检索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,因此对它们中的任何一个都可以解决。

编辑:

我试过在flush()方法之后添加save(),但仍然无法正常工作:

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


我也尝试过在flush()之后添加commit()函数,但是会抛出异常,表明没有事务处于活动状态。

最佳答案

这里您有一个解决方案:

实体:

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


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

10-04 23:13