使用hibernate从数据库获取下一个序列值
我有一个实体,该实体具有必须从序列中设置的NON-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只发出 select nextval
('local_key_sequence')命令。注意:在数据库方面,缓存设置为1。
如果我尝试手动获取所有数据,将需要我70,000个选择,因此性能上会有巨大差异。有谁知道Hibernate的内部功能,以及如何手动重现它?
回答:
我找到了解决方案:
public class DefaultPostgresKeyServer{
private Session session;
private Iterator<BigInteger> iter;
private long batchSize;
public DefaultPostgresKeyServer (Session sess, long batchFetchSize)
{
this.session=sess;
batchSize = batchFetchSize;
iter = Collections.<BigInteger>emptyList().iterator();
}
@SuppressWarnings("unchecked")
public Long getNextKey()
{
if ( ! iter.hasNext() )
{
Query query = session.createSQLQuery( "SELECT nextval( 'mySchema.mySequence' ) FROM generate_series( 1, " + batchSize + " )" );
iter = (Iterator<BigInteger>) query.list().iterator();
}
return iter.next().longValue() ;
}
}
以上是 使用hibernate从数据库获取下一个序列值 的全部内容, 来源链接: utcz.com/qa/416336.html