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

How to get the auto-increment primary key value in MySQL using Hibernate

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

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

或者我可以只使用jdbc来做到这一点?


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

1
2
3
4
5
6
7
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一级缓存无效,然后再次获取它。

但是,为了可移植性,您可能需要考虑将Hibernate与序列样式ID生成一起使用。如果需要,这将简化从MySQL的过渡。当然,如果使用这种类型的生成器,则可以立即获取ID,因为Hibernate需要在持久化对象之前解析列值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@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名称外,还可以剪切和粘贴。


在自动增量生成器类的情况下,当我们使用save()方法时,它将返回主键(假设其为id)。因此它返回该特定的id,因此您可以执行此操作

1
int id = session.save(modelClass);

并返回id


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

1
2
3
4
5
Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
Query query = session.createSQLQuery("select nextval('schemaName.keySequence')" );

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

在Hibernate中调用save()方法时,该对象不会立即写入数据库。当您尝试从数据库(从同一张表中读取)或显式调用flush()时,就会发生这种情况。在相应的记录未插入数据库表之前,MySQL不会为其分配ID。

因此,id是可用的,但是在Hibernate实际上将记录插入MySQL表之前没有。