2016-08-09 53 views
2

我需要在persist()之后检索数据库生成的ID。我的单位是这样的:在休眠后继续获取数据库生成的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; 

    ... 
} 

但是,执行下一段代码的时候,实体保存在数据库,但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(); 

我也试过commit()后加入flush()功能然而,抛出异常,说没有事务处于活动状态。

回答

1

这里有一个解决方案:

实体

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

    ... 
} 

CREATE FUNCTION

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) 。我不知道他们是否都是相同的,但它是有效的。

1

您需要添加一个

em.flush(); 

迫使实体管理器中的数据。然后at.getID()将返回值。

+0

仍然无法正常工作。我已经更新了我所做的更改。任何想法?我正在使用Hibernate 5.2.4最终 –

+0

提交关闭了事务,如果您使用CMP,则不需要。把它拿出来看看它是否有效。 – WPrecht

+0

仍然无法正常工作。我已经删除了persist(),但仍然返回0.我也尝试通过保存没有事务的实体,按照本教程[链接](http://www.journaldev.com/3481/hibernate-session-merge -vs-update-save-saveorupdate-persist-example)并启用自动提交属性,但我认为这不再适用于最新版本的Hibernate。 –