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

|| 我正在使用Hibernate访问MySQL,并且我有一个带有自动增量主键的表。 每次我在表中插入一行时,都不需要指定主键。但是,在插入新行之后,如何使用休眠立即获取相对主键? 或者我可以只使用jdbc来做到这一点?     
已邀请:
        保存休眠实体时,将为您填充
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一级缓存无效,然后再次获取它。 但是,出于可移植性,您可能要考虑将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名称外,还可以剪切和粘贴。     
        在Hibernate中调用save()方法时,该对象不会立即写入数据库。当您尝试从数据库中读取(从同一张表?)或显式调用flush()时,它就会发生。在没有将相应的记录插入数据库表之前,MySQL不会为其分配ID。 因此,该id是可用的,但是在Hibernate实际上将记录插入MySQL表之前没有。     
        如果需要,可以使用以下方法独立于对象获取下一个主键:
Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
Query query = session.createSQLQuery( \"select nextval(\'schemaName.keySequence\')\" );

Long key = (Long) query.list().get( 0 );
return key;
    
        好在自动增量生成器类的情况下,当我们使用
save()
方法时,它将返回主键(假设其ass0ѭ)。因此它返回特定的
id
,因此您可以执行此操作
int id = session.save(modelClass);
并返回
id
    

要回复问题请先登录注册