如何使用Hibernate在MySQL中获取自增主键的值

8

我正在使用Hibernate访问MySQL,我有一个带有自增主键的表。

每次插入一行到表中时,我不需要指定主键。但是在插入新行后,如何立即使用Hibernate获取相关的主键?

或者我可以使用JDBC来完成这个操作吗?

5个回答

10

当你保存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来确保保存操作成功。


即使事务未提交且会话尚未关闭,这种情况是否仍会发生。 - Ace

2

一旦您持久化了对象,您应该能够调用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名称即可。


0
当您在Hibernate中调用save()方法时,对象不会立即写入数据库。它会在您尝试从数据库读取(来自同一张表?)或显式调用flush()时发生。直到相应的记录未插入到数据库表中,MySQL才不会为其分配ID。
因此,ID可用,但是在Hibernate实际将记录插入MySQL表之前不可用。

0
如果您想獨立於對象獲取下一個主鍵,可以使用以下方法:
Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
Query query = session.createSQLQuery( "select nextval('schemaName.keySequence')" );

Long key = (Long) query.list().get( 0 );
return key;

0

在自增生成器类的情况下,当我们使用 save() 方法时,它会返回主键(假设是 id)。因此,它会返回该特定的 id,这样您就可以这样做。

int id = session.save(modelClass);

并返回id


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接