代码之家  ›  专栏  ›  技术社区  ›  maaartinus

如何启用Hibernate HiLo实体标识符优化器策略

  •  2
  • maaartinus  · 技术社区  · 9 年前

    我在初始化Hibernate时不使用任何XML,方法如下

    org.hibernate.SessionFactory sessionFactory = 
        new org.hibernate.cfg.Configuration().
        .setProperty(...)
        .setProperty(...)
        ...
        .buildSessionFactory();
    

    我的类使用ID,如

    @Id @Generated(GenerationTime.INSERT) @GeneratedValue private Integer id;
    

    使用的发电机是 SequenceStyleGenerator ,这似乎是不推荐的 SequenceGenerator SequenceHiLoGenerator 等等。它使用

    public static final int DEFAULT_INCREMENT_SIZE = 1;
    

    并且似乎允许通过

    public static final String INCREMENT_PARAM = "increment_size";
    

    但这就是我能找到的全部。我想我必须设置一些属性“xxx.yyy.increment_size”,或者以另一种方式将其传递给Hibernate,但我看不出怎么做。


    我知道 @SequenceGenerator ,但似乎完全被忽视了

    2 回复  |  直到 5 年前
        1
  •  3
  •   maaartinus    9 年前

    我想你正在寻找如何设置 increment_size 您的财产 SequenceSytleGenerator .

    设置下面的示例代码段 增量_大小 使用 @GenericGenerator 带有的注释 hilo 优化器和 SEQUENCE 策略

    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "hilo_generator")
    @GenericGenerator(
            name = "hilo_generator",
            strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
            parameters = {
                    // Or leave it out to get "hibernate_sequence".
                    @Parameter(name = "sequence_name", value = "hilo_sequence"),
                    // Or leave it out as this is the default.
                    @Parameter(name = "initial_value", value = "1"),
                    @Parameter(name = "increment_size", value = "5"),
                    @Parameter(name = "optimizer", value = "hilo")
            })
    

    您无法全局设置 DEFAULT_INCREMENT_SIZE 具有Hibernate配置属性。您需要使用 @Id 改为配置属性。

        2
  •  1
  •   Vlad Mihalcea    3 年前

    @生成与@GeneratedValue

    你不需要使用 @Generated 随着 @GeneratedValue 这个 @已生成 注释用于数据库在INSERT或UPDATE期间生成的非id实体属性。有关 @已生成 注释。

    另一方面 @生成的值 仅用于实体标识符属性,这是在持久化实体时自动生成实体标识符时需要使用的。

    序列发生器

    当您持久化实体时,序列生成器需要额外的数据库往返来调用序列对象。因此,Hibernate提供了基于序列的优化器,以减少获取实体标识符值所需的往返次数。

    现在,如果你想使用 hilo ,标识符映射如下:

    @Id
    @GeneratedValue(
        strategy = GenerationType.SEQUENCE, 
        generator = "post_sequence"
    )
    @GenericGenerator(
        name = "post_sequence",
        strategy = "sequence",
        parameters = {
            @Parameter(name = "sequence_name",  value = "post_sequence"),
            @Parameter(name = "initial_value",  value = "1"),
            @Parameter(name = "increment_size",  value = "3"),
            @Parameter(name = "optimizer", value = "hilo")
        }
    )
    private Long id;
    

    除了必须使用特定于Hibernate的 @GenericGenerator ,问题在于 希洛 生成的标识符不包括数据库序列值,因此使用数据库的第三方客户端将不知道如何生成下一个标识符值,除非他们知道 希洛 算法和 allocationSize .

    因此,最好使用 pooled pooled-lo .

    池优化器

    这个 汇集的 优化器非常容易设置。您只需设置 分配大小 JPA的 @SequenceGenerator 注释,Hibernate将切换到使用 汇集的 优化器:

    @Id
    @GeneratedValue(
        strategy = GenerationType.SEQUENCE,
        generator = "post_sequence"
    )
    @SequenceGenerator(
        name = "post_sequence",
        sequenceName = "post_sequence",
        allocationSize = 3
    )
    private Long id;
    

    Hibernate pooled optimizere

    池lo优化器

    要使用池lo优化器,只需添加以下配置属性:

    <property name="hibernate.id.optimizer.pooled.preferred" value="pooled-lo" />
    

    现在,实体标识符映射与我之前为您展示的 汇集的 优化器。

    要了解池化lo的工作原理,请查看下图:

    Hibernate pooled-lo optimizer

    如果您一直在使用传统 希洛 优化器,您可能希望切换到使用 汇集的 汇集的lo 希洛 无法与其他可能不知道 hilo 标识符分配策略。