如何使用现有的Oracle序列在hibernate中生成id?
我有一个名为如何使用现有的Oracle序列在hibernate中生成id?,oracle,hibernate,sequence,Oracle,Hibernate,Sequence,我有一个名为PRODUCT\u ID\u SEQ的旧版Oracle db 以下是我需要为其生成正确ID的产品类的映射: public class Product { @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "retailerRaw_seq") @SequenceGenerator(name = "retailerRaw_seq",
PRODUCT\u ID\u SEQ
的旧版Oracle db
以下是我需要为其生成正确ID的产品
类的映射:
public class Product {
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "retailerRaw_seq")
@SequenceGenerator(name = "retailerRaw_seq",
sequenceName = "PRODUCT_ID_SEQ")
private Long id;
...
}
但是看起来ID是以50的间隔生成的,比如1000、1050、1100等。这对应于allocationSize
property=50的默认值。这意味着Hibernate实际上并不使用数据库中已经定义的序列
如何使Hibernate使用序列?我不习惯使用注释,这是我的*.hbm.xml中的内容:
<id name="id" type="java.lang.Integer">
<column name="ID_PRODUCT" />
<generator class="sequence-identity" >
<param name="sequence">PRODUCT_ID_SEQ</param>
</generator>
</id>
产品标识
您可以轻松地将其映射到注释。生成器序列标识使用序列自动递增。默认情况下,Hibernate使用sequence HiLo generator,除非您有特殊需要,否则它是好的(性能方面)。你可以在我的博客上读到更多
Eyal这里是一个带有注释的工作示例,这样,将使用现有的DB序列(您也可以使用“序列”策略,但插入时性能较差):
原问题的答复如下:
@SequenceGenerator(name="EL_SEQ", sequenceName="EL_SEQ",allocationSize=1)
正是
allocationSize
将值设置为递增。如果使用javax.persistence.SequenceGenerator,hibernate使用hilo,可能会在序列中产生较大的间隔。有一个帖子解决了这个问题:
有两种方法可以解决此问题
我已经测试了这两种方法,效果很好。我在PostgreSQL上使用了following,效果很好
@Id
@GeneratedValue(generator = "my_gen")
@SequenceGenerator(name = "my_gen", sequenceName = "my_seq_in_db")
private int userId;
在Oracle中创建序列名,例如contacts_seq。 在你的POJO课上。为序列定义以下注释
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_seq_gen")
@SequenceGenerator(name="my_seq_gen", sequenceName="contacts_seq")
allocationSize和incrementBy是完全不同的事情 Hibernate当然使用在DB中创建的序列,但根据allocationSize的不同,您可能会发现生成的值存在差距 例如— 假设当前序列值为5,以db为单位递增1,分配大小默认值为50 现在您想通过hibernate保存一个由3个元素组成的集合,然后 Hibernate将分配生成的id 250、251、252 这是为了优化目的。Hibernate不必返回db并获取下一个递增的值
如果您不想这样做,只需按照前面的回答设置allocationSize=1即可从3.5.5升级到5.0.6.Final时,我也遇到了同样的问题 我通过在HBM文件中重新配置映射解决了这一问题:
<generator class="sequence">
<param name="sequence">PRODUCT_ID_SEQ</param>
</generator>
产品标识
致:
真的
没有一个
1.
产品标识
首先:您应该在数据库中创建如下顺序:
CREATE SEQUENCE "PRODUCT_ID_SEQ" MINVALUE 0 MAXVALUE 1000000000 INCREMENT BY 1 START WITH 1 CACHE 500 NOORDER NOCYCLE ;
并在文件Product.hbm.xml配置中:
<class name="ProductPersistant" table="Product">
<id name="id" type="java.lang.Long" column="productID" >
<generator class="sequence">
<param name="sequence">PRODUCT_ID_SEQ</param>
</generator>
</id>
产品标识
重复问题:请看“否”,它不是重复的。请参见下面的答案这是正确的方法(使用xml)请参见下面的注释+1示例,并记住在hibernate.cfg.xml
文件中添加true
,因为这是正确的JPA解决方案,而不是特定于hibernate的。然而,allocationSize=1意味着每次插入都需要从数据库中获取一个数字,而不是一次缓存大量id,因此它会带来非常小的性能下降。我发现,使用这种技术时,它可以工作,但我的数据库将其id值增加了2,而不是1。有什么想法吗?检查一下Oracle中的序列定义,你可能会有类似“创建序列我的序列从1递增2开始”这样的想法。有什么想法改变算法,比如说使用JPA注释进行池化而不是hilo?有必要将增量大小设置为1吗?这不是默认值吗?PostgreSQL和Oracle是不同的数据库类型
CREATE SEQUENCE "PRODUCT_ID_SEQ" MINVALUE 0 MAXVALUE 1000000000 INCREMENT BY 1 START WITH 1 CACHE 500 NOORDER NOCYCLE ;
<class name="ProductPersistant" table="Product">
<id name="id" type="java.lang.Long" column="productID" >
<generator class="sequence">
<param name="sequence">PRODUCT_ID_SEQ</param>
</generator>
</id>