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

时间:2016-08-09 15:38:33

标签: java 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,因此任何一个解决方案都可以。

修改

我已经尝试在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()函数,但是会抛出异常,说没有事务处理。

2 个答案:

答案 0 :(得分:1)

您需要添加

em.flush();

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

答案 1 :(得分:1)

这里有一个解决方案:

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

    ...
}

创建功能

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的{​​{1}}注释。我不知道它们是否代表相同,但它确实有效。