相关疑难解决方法(0)

使用hibernate从数据库中获取下一个序列值

我有一个具有NON-ID字段的实体,必须从序列中设置.目前,我获取序列的第一个值,将其存储在客户端,并从该值进行计算.

但是,我正在寻找一种"更好"的方式来做到这一点.我已经实现了一种获取下一个序列值的方法:

public Long getNextKey()
{
    Query query = session.createSQLQuery( "select nextval('mySequence')" );
    Long key = ((BigInteger) query.uniqueResult()).longValue();
    return key;
}
Run Code Online (Sandbox Code Playgroud)

但是,这种方式会显着降低性能(〜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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,这种方法也不起作用(所有返回的Ids都是0).

有人可以告诉我如何有效地使用Hibernate获取下一个序列值吗?

编辑:经过调查,我发现调用的Query query = session.createSQLQuery( "select nextval('mySequence')" );效率远低于使用@GeneratedValue- 因为Hibernate 以某种方式设法减少访问所描述的序列时的提取次数@GeneratedValue.

例如,当我创建70,000个实体时(因此从同一序列中获取70,000个主键),我得到了我需要的一切.

但是,Hibernate只发出1404个 select nextval ('local_key_sequence') …

sql hibernate sequence nextval

31
推荐指数
3
解决办法
13万
查看次数

标签 统计

hibernate ×1

nextval ×1

sequence ×1

sql ×1