我有一个实体,它有一个必须从序列中设置的非 ID 字段。目前,我获取序列的第一个值,将其存储在客户端,并根据该值进行计算。
但是,我正在寻找一种“更好”的方式来做到这一点。我已经实现了一种获取下一个序列值的方法:
public Long getNextKey()
{
Query query = session.createSQLQuery( "select nextval('mySequence')" );
Long key = ((BigInteger) query.uniqueResult()).longValue();
return key;
}
但是,这种方式会显着降低性能(创建约 5000 个对象会减慢 3 倍 - 从 5740ms 到 13648ms )。
我试图添加一个“假”实体:
@Entity
@SequenceGenerator(name = "sequence", sequenceName = "mySequence")
public class SequenceFetcher
{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence")
private long id;
public long getId() {
return id;
}
}
然而,这种方法也不起作用(所有返回的 Id 都是 0)。
有人可以建议我如何有效地使用 Hibernate 获取下一个序列值吗?
编辑:经过调查,我发现调用Query query = session.createSQLQuery( "select nextval('mySequence')" );
比使用@GeneratedValue
- 效率低得多,因为 Hibernate在访问@GeneratedValue
.
例如,当我创建 70,000 个实体时(因此从同一个序列中提取了 70,000 个主键),我得到了我需要的一切。
但是,Hibernate 只发出1404 select nextval ('local_key_sequence')
命令。注意:在数据库端,缓存设置为 1。
如果我尝试手动获取所有数据,我将需要 70,000 次选择,因此性能差异很大。有谁知道 Hibernate 的内部功能,以及如何手动重现它?