Java 在Hibernate中持久化后获取数据库生成的ID

Java 在Hibernate中持久化后获取数据库生成的ID,java,hibernate,Java,Hibernate,我需要检索数据库在持久化之后生成的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。我的实体如下所示:

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

有人能帮我吗

PD:我不在乎使用Session或EntityManager,所以在其中任何一个上都可以找到解决方案

编辑:

我已尝试在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函数,但是抛出了一个异常,表示没有活动的事务。

您需要添加一个

em.flush();

强制实体管理器同步数据。然后at.getID将返回值。

这里有一个解决方案:

实体:

创建函数


如您所见,我已经更改了@GeneratedValuestrategy=GenerationType.IDENTITY的@Generated注释。我不知道这两个词是否代表同一个词,但它是有效的

仍然不起作用。我已经用我所做的更改更新了问题。有什么想法吗?我使用的是Hibernate 5.2.4 Finalth提交关闭了事务,如果您使用的是CMP,则不需要提交。把它拿出来,看看能不能用,还是不行。我已删除持久化,但仍返回0。我也尝试过在没有事务的情况下保存实体,遵循本教程并启用自动提交属性,但我认为这在最新版本的Hibernate上不再有效。
em.flush();
@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);