我需要检索数据库在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()
函数,但是会抛出异常,说没有事务处理。
答案 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}}注释。我不知道它们是否代表相同,但它确实有效。