我需要检索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)
注释。我不知道它们是否代表相同的意思,但是可以。