我正在通过类似
之类的东西初始化Hibernate而没有任何XMLorg.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
,但似乎完全被忽略了
答案 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
与@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
,否则他们不知道如何生成下一个标识符值。
因此,最好使用pooled
或pooled-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;
要使用pooled-lo优化器,只需添加以下配置属性:
<property name="hibernate.id.optimizer.pooled.preferred" value="pooled-lo" />
现在,实体标识符映射与我之前为pooled
优化器展示的映射相同。
要了解pooled-lo的工作原理,请查看以下图表:
如果您一直在使用旧版
hilo
优化器,则可能要切换为使用pooled
或pooled-lo
,因为hilo
无法与可能不知道hilo
标识符分配策略。有关如何从
hilo
迁移到pooled
或pooled-lo
的详细信息,请查看this article。