启用Hibernate HiLo策略

时间:2015-12-31 20:53:25

标签: java hibernate hilo

我正在通过类似

之类的东西初始化Hibernate而没有任何XML
org.hibernate.SessionFactory sessionFactory = 
    new org.hibernate.cfg.Configuration().
    .setProperty(...)
    .setProperty(...)
    ...
    .buildSessionFactory();

我的课程使用像

这样的ID
@Id @Generated(GenerationTime.INSERT) @GeneratedValue private Integer id;

使用的生成器是SequenceStyleGenerator,它似乎取代了已弃用的SequenceGeneratorSequenceHiLoGenerator等等。它使用

public static final int DEFAULT_INCREMENT_SIZE = 1;

似乎允许通过

进行配置
public static final String INCREMENT_PARAM = "increment_size";

但这是我能找到的全部内容。我想我必须设置一些属性" xxx.yyy.increment_size"或以另一种方式传递给Hibernate,但我无法理解。

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

2 个答案:

答案 0 :(得分:3)

我想您正在寻找如何为increment_size设置SequenceSytleGenerator属性。

使用increment_size优化和@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")
        })

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

答案 1 :(得分:0)

@Generated vs @GeneratedValue

您无需将@Generated@GeneratedValue一起使用。 @Generated注释用于数据库在INSERT或UPDATE期间生成的非id实体属性。有关@Generated批注的更多详细信息,请查看this article

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

序列发生器

当您保留实体时,序列生成器需要额外的数据库往返调用序列对象。因此,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之外,hilo的问题还在于生成的标识符不包含数据库序列值,因此使用该数据库的第三方客户端将除非他们知道hilo算法和allocationSize,否则他们不知道如何生成下一个标识符值。

因此,最好使用pooledpooled-lo

池优化器

pooled优化器很容易设置。您所需要做的就是设置JPA allocationSize批注的@SequenceGenerator,然后Hibernate将切换到使用pooled优化器:

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

Hibernate pooled optimizere

Pooled-lo优化器

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

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

现在,实体标识符映射与我之前为pooled优化器展示的映射相同。

要了解pooled-lo的工作原理,请查看以下图表:

Hibernate pooled-lo optimizer

  

如果您一直在使用旧版hilo优化器,则可能要切换为使用pooledpooled-lo,因为hilo无法与可能不知道hilo标识符分配策略。

     

有关如何从hilo迁移到pooledpooled-lo的详细信息,请查看this article