如何使用现有的Oracle序列在hibernate中生成id?

Vla*_*mir 25 oracle hibernate sequence

我有遗留的Oracle数据库,其序列名称为PRODUCT_ID_SEQ.

这是Product我需要生成正确id 的类的映射:

public class Product {
   @GeneratedValue(strategy = GenerationType.SEQUENCE, 
                       generator = "retailerRaw_seq")
   @SequenceGenerator(name = "retailerRaw_seq", 
                      sequenceName = "PRODUCT_ID_SEQ")
   private Long id;

   ...
}
Run Code Online (Sandbox Code Playgroud)

但看起来像id生成的间隔为50,如1000,1050,1100等.这对应于allocationSizeproperty = 50 的默认值.这意味着Hibernate实际上并没有使用已在db中定义的序列.

如何使Hibernate使用序列?

Mik*_*nok 27

原问题的答案:

@SequenceGenerator(name="EL_SEQ", sequenceName="EL_SEQ",allocationSize=1)
Run Code Online (Sandbox Code Playgroud)

它将allocationSize值设置为递增.

  • Upvoted,因为这是一个正确的JPA解决方案,而不是特定于Hibernate.但是,allocationSize = 1意味着需要从数据库中为每个插入获取一个数字,而不是一次缓存大量的ID,因此它会带来非常小的性能下降. (7认同)

rsi*_*va4 18

我不习惯使用注释,这是我在*.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>
Run Code Online (Sandbox Code Playgroud)

您可以轻松地将其映射到注释.生成器序列标识使用序列的自动增量.

  • +1并记住在`hibernate.cfg.xml`文件中添加`<property name ="hibernate.jdbc.use_get_generated_keys"> true </ property>`. (2认同)

Tri*_*tan 9

这是一个带注释的工作示例,这样就会使用现有的DB序列(您也可以使用"序列"策略,但插入时性能较差):

@Entity
@Table(name = "USER")
public class User {

    // (...)

    @GenericGenerator(name = "generator", strategy = "sequence-identity", parameters = @Parameter(name = "sequence", value = "USER_SEQ"))
    @Id
    @GeneratedValue(generator = "generator")
    @Column(name = "ID", unique = true, nullable = false, precision = 22, scale = 0)
    public Long getId() {
        return this.id;
    }
Run Code Online (Sandbox Code Playgroud)


小智 6

从3.5.5升级到5.0.6.Final时,我遇到了同样的问题.

我通过重新配置HBM文件中的映射来解决它:

    <generator class="sequence">
        <param name="sequence">PRODUCT_ID_SEQ</param>
    </generator>
Run Code Online (Sandbox Code Playgroud)

至:

    <generator class="org.hibernate.id.enhanced.SequenceStyleGenerator"> 
        <param name="prefer_sequence_per_entity">true</param> 
        <param name="optimizer">none</param>
        <param name="increment_size">1</param>
        <param name="sequence_name">PRODUCT_ID_SEQ</param>
    </generator>
Run Code Online (Sandbox Code Playgroud)


小智 5

在Oracle中创建序列名称,例如contacts_seq.在您的POJO课程中.为序列定义以下注释.

@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="my_seq_gen")
@SequenceGenerator(name="my_seq_gen", sequenceName="contacts_seq")
Run Code Online (Sandbox Code Playgroud)