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

Posted

技术标签:

【中文标题】如何使用 Hibernate 在 MySQL 中获取自增主键值【英文标题】:How to get the auto-increment primary key value in MySQL using Hibernate 【发布时间】:2011-09-14 20:15:03 【问题描述】:

我正在使用 Hibernate 访问 mysql,并且我有一个带有自动增量主键的表。

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

或者我可以只使用 jdbc 来执行此操作?

【问题讨论】:

【参考方案1】:

一旦你持久化了对象,你应该可以调用 getId() 或者你的@ID 列,所以你可以从你的方法中返回它。您还可以使 Hibernate 一级缓存无效并再次获取它。

但是,为了可移植性,您可能希望考虑将 Hibernate 与序列样式 ID 生成一起使用。如果您需要,这将简化从 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 名称之外,它是您可以剪切和粘贴的东西。

【讨论】:

【参考方案2】:

当您保存休眠实体时,id 属性将为您填充。所以如果你有

MyThing thing = new MyThing();
...

// save the transient instance.
dao.save(thing);

// after the session flushes, thing.getId() should return the id.

实际上,在我的测试中,我几乎总是在持久化实体的 id 上使用assertNotNull,以确保保存有效。

【讨论】:

即使事务未提交且会话尚未关闭也会发生这种情况。【参考方案3】:

当您在 Hibernate 中调用 save() 方法时,对象不会立即写入数据库。当您尝试从数据库(从同一个表?)读取或显式调用 flush() 时,会发生这种情况。直到对应的记录没有插入到数据库表中,MySQL才会为其分配id。

所以,id 是可用的,但在 Hibernate 实际将记录插入 MySQL 表之前。

【讨论】:

【参考方案4】:

如果需要,您可以使用以下方法独立于对象获取下一个主键:

Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
Query query = session.createSQLQuery( "select nextval('schemaName.keySequence')" );

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

【讨论】:

【参考方案5】:

在自动增量生成器类的情况下,当我们使用save() 方法时,它会返回主键(假设它的id)。所以它返回那个特定的id,所以你可以这样做

int id = session.save(modelClass);

然后返回id

【讨论】:

以上是关于如何使用 Hibernate 在 MySQL 中获取自增主键值的主要内容,如果未能解决你的问题,请参考以下文章

如何在当前使用 HSQLDB 的 Spring 和 Hibernate 后台使用 MySQL

如何在 MySQL 上使用 Hibernate 批量插入递增的 ID?

如何在 Hibernate、MySQL 应用程序中使用 import.sql 文件将默认数据插入表中

hibernate - 如何在 mysql 和 oracle 数据库中设置自动增量?

如何使用hibernate grails 3,mysql?

如何将 Hibernate 与 MySQL 连接