我正在使用Hibernate访问MySQL,并且我有一个带有自动递增主键的表。如何在MySQL中使用Hibernate获取自动递增主键值
每次我向表中插入一行时,我不需要指定主键。但是当我插入一个新行后,我怎么才能立即使用hibernate获得相对主键?
或者我可以只使用jdbc来做到这一点?
我正在使用Hibernate访问MySQL,并且我有一个带有自动递增主键的表。如何在MySQL中使用Hibernate获取自动递增主键值
每次我向表中插入一行时,我不需要指定主键。但是当我插入一个新行后,我怎么才能立即使用hibernate获得相对主键?
或者我可以只使用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()
方法返回的主键(假设其id
)。因此,它返回一个特定id
,这样你就可以做到这一点
int id = session.save(modelClass);
,并返回id
是否即使事务未提交和会话还没有关闭这一点。 – Ace 2014-03-21 02:45:05