我正在使用Hibernate访问MySQL,我有一个带有自增主键的表。
每次插入一行到表中时,我不需要指定主键。但是在插入新行后,如何立即使用Hibernate获取相关的主键?
或者我可以使用JDBC来完成这个操作吗?
我正在使用Hibernate访问MySQL,我有一个带有自增主键的表。
每次插入一行到表中时,我不需要指定主键。但是在插入新行后,如何立即使用Hibernate获取相关的主键?
或者我可以使用JDBC来完成这个操作吗?
当你保存Hibernate实体时,id
属性将被自动填充。因此,如果你有以下代码:
MyThing thing = new MyThing();
...
// save the transient instance.
dao.save(thing);
// after the session flushes, thing.getId() should return the id.
在我的测试中,我几乎总是对持久化实体的ID执行assertNotNull
来确保保存操作成功。
一旦您持久化了对象,您应该能够调用getId()或其他@ID列的方法,从而可以从您的方法中返回它。您还可以使Hibernate第一级缓存无效并重新获取它。
然而,为了可移植性,您可能想使用基于序列的ID生成器来使用Hibernate。这将使您在需要时更轻松地迁移到MySQL之外的数据库。当然,如果您使用此类生成器,您将能够立即获得ID,因为Hibernate需要在持久化对象之前解析列值:
@Id
@GeneratedValue (generator="MY_SEQ")
@GenericGenerator( name = "MY_SEQ",
strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = {
@Parameter(name = "sequence_name", value = "MY_SEQ"),
@Parameter(name = "initial_value", value = "1"),
@Parameter(name = "increment_size", value = "10") }
)
@Column ( name = "id", nullable = false )
public Long getId () {
return this.id;
}
这个东西有点复杂,但你可以复制和粘贴,只需要更改SEQUENCE名称即可。
Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
Query query = session.createSQLQuery( "select nextval('schemaName.keySequence')" );
Long key = (Long) query.list().get( 0 );
return key;
在自增生成器类的情况下,当我们使用 save()
方法时,它会返回主键(假设是 id
)。因此,它会返回该特定的 id
,这样您就可以这样做。
int id = session.save(modelClass);
并返回id