Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用现有的Oracle序列在hibernate中生成id?_Oracle_Hibernate_Sequence - Fatal编程技术网

如何使用现有的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,可能会在序列中产生较大的间隔。有一个帖子解决了这个问题:

有两种方法可以解决此问题

  • 在SequenceGenerator注释中,添加allocationSize=1,initialValue=1

  • 不要使用javax.persistence.SequenceGenerator,而是使用org.hibernate.annotations,如下所示:

    @SequenceGenerator(name=“Question\u id\u sequence”,sequenceName=“S\u Question”)

    @org.hibernate.annotations.GenericGenerator(name=“Question\u id\u sequence”,strategy=“sequence”,parameters={@Parameter(name=“sequence”,value=“S\u Question”)})


  • 我已经测试了这两种方法,效果很好。

    我在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")
    

    allocationSizeincrementBy是完全不同的事情

    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>