hibernate mysql 序列_使用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只发出 1404 select nextval

('local_key_sequence')命令。注意:在数据库方面,缓存设置为1。

如果我尝试手动获取所有数据,将需要我70,000个选择,因此性能上会有巨大差异。有谁知道Hibernate的内部功能,以及如何手动重现它?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值