我有一个实体,该实体具有必须从序列中设置的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的内部功能,以及如何手动重现它?
我找到了解决方案:
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() ;
}
}
问题内容: 我有gwt应用程序在后端连接到postgres DB,并且有一个Java类’Judgement’映射了数据库中的’judgements’表,当我尝试将判断持久化到db时,它引发了以下错误: 我的审判课看起来像这样 我的表判断是: 我在数据库中有一个SEQUENCE名称’judgements_id_seq’ 谁能告诉我怎么了???谢谢。 问题答案: Hibernate的PostgreSQ
问题内容: 我有一个包含html表单的网站,在此表单中,我有一个下拉列表,其中包含在该公司工作的代理的列表,我想从MySQL数据库中获取数据到该下拉列表,因此当您添加新代理时,他的名字将会出现作为下拉列表中的一个选项。 您能帮我编码这个php代码吗,谢谢 问题答案: 为此,您要遍历查询结果的每一行,并将此信息用于下拉菜单的每个选项。您应该能够轻松调整以下代码,以满足您的需求。
问题内容: 我最近将应用程序中的hiberbnate模式更新为5.4.4.Final。现在,在部署过程中我面临以下异常。 我使用以下persistence.xml。 经过进一步调查,我发现根本原因是:hibernate使用 SequenceInformation 接口进行序列元数据操作 但是,我的应用程序使用如下序列: 该 Long.MAX_VALUE 等于9223372036854775807,
问题内容: 这是我的类,用于从数据库中获取数据 这是我的文件: 当我运行该程序时,出现异常后,请帮助我如何解决它。我是Hibernate的新手,尝试学习但被卡住了。 虽然我能够将数据存储在数据库中,但我有2个用于第一和第二类的数据获取数据,但在获取数据时遇到了问题PLZ帮助。 问题答案: 让我引述一下: 据我所知,您正在使用表名。 所以应该是这样的:
问题内容: 有人知道如何在hibernate配置中添加另一个数据源,以及如何在自己的DAO中将Spring配置为其自动注入该数据源吗? 这是我的带有一个数据源的代码,可以完美运行,但是我不知道如何添加另一个数据源。我想添加另一个数据源,该数据源是具有与实际数据库不同的表的数据库。 DAO EXAMPLE 问题答案: 我假定你有一组应使用的DAO的和适当的,而其他人应该使用不同的和基于。当然,你需要
我有一个实体类具有以下主键生成策略 我想知道是否有一种方法可以使用EntityManager向表生成器询问下一个值。