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

时间:2011-06-14 15:56:48

标签: mysql hibernate auto-increment

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

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

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

5 个答案:

答案 0 :(得分: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以确保保存有效。

答案 1 :(得分:2)

一旦你坚持使用该对象,你应该能够调用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 :(得分:0)

当您在Hibernate中调用save()方法时,该对象不会立即写入数据库。当您尝试从数据库(从同一个表?)读取或显式调用flush()时,它会发生。在没有将相应的记录插入数据库表之前,MySQL不会为它分配一个id。

因此,id可用,但在Hibernate实际将记录插入MySQL表之前不可用。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

int id = session.save(modelClass);

并返回id