2

我正在通过类似的方式初始化 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,但似乎完全被忽略了

4

2 回答 2

3

我猜您正在寻找如何increment_size为您的SequenceSytleGenerator.

下面的示例片段increment_size使用带有优化器和策略的@GenericGenerator注释进行设置。hiloSEQUENCE

@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配置属性。

于 2016-01-03T07:33:59.103 回答
1

@Generated 与 @GeneratedValue

您不需要@Generated@GeneratedValue. 注解用于数据库在 INSERT 或 UPDATE 期间生成的@Generated非 ID 实体属性。有关@Generated注释的更多详细信息。

另一方面,@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-specific 之外@GenericGenerator,问题hilo在于生成的标识符不包括数据库序列值,因此使用数据库的第 3 方客户端将不知道如何生成下一个标识符值,除非他们知道hilo算法和allocationSize.

因此,最好使用pooledor pooled-lo

池化优化器

优化器pooled很容易设置。您需要做的就是设置allocationSizeJPA@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-lo 优化器,只需添加以下配置属性:

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

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

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

Hibernate pooled-lo 优化器

如果您一直在使用旧版hilo优化器,您可能希望切换到使用pooledor pooled-lo,因为hilo它无法与可能不知道hilo标识符分配策略的其他客户端互操作。

于 2019-12-18T11:10:53.370 回答