我有一个实体,该实体具有必须从序列设置的非 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 有效地获取下一个序列值吗?
Edit:经过调查,我发现调用Query query = session.createSQLQuery( "select nextval('mySequence')" );
到目前为止,比使用@GeneratedValue
- 因为休眠somehow设法减少访问所描述的序列时的获取次数@GeneratedValue
.
例如,当我创建 70,000 个实体(因此从同一序列中获取 70,000 个主键)时,我得到了所需的一切。
HOWEVER, 仅 Hibernate 问题1404 select nextval ('local_key_sequence')
命令。注意:在数据库端,缓存设置为1。
如果我尝试手动获取所有数据,将需要 70,000 次选择,因此性能差异巨大。有谁知道 Hibernate 的内部功能,以及如何手动重现它?