当前位置: 首页 > 面试题库 >

Hibernate,@ SequenceGenerator和allocationSize

穆彬郁
2023-03-14
问题内容

我们都知道使用Hibernate时的默认行为@SequenceGenerator-它使实际数据库序列增加
,将该值乘以50(默认allocationSize值)-然后将该值用作实体ID。

这是错误的行为,并与说明以下内容的规范冲突:

distributionSize-(可选)从序列中分配序列号时要增加的数量。

需要明确的是:我不关心生成的ID之间的差距。

我关心与基础数据库序列 不一致的 ID 。例如:任何其他应用程序(例如,使用纯JDBC)可能要在从序列获得的ID下插入新行-
但所有这些值可能已被Hibernate使用!疯狂。

有人知道任何解决此问题的方法(没有设置allocationSize=1,从而降低性能)吗?

编辑:
弄清楚。如果最后插入的记录的ID = 1,则HB同时51, 52, 53...在其新实体BUT中使用值:数据库中序列的值将设置为2。当其他应用程序使用该序列时,很容易导致错误。

另一方面:规范(据我所知)说数据库序列应该设置为51,同时HB应该使用范围内的值 2, 3 ... 50

更新:
正如下面的史蒂夫·埃伯索尔(Steve
Ebersole)所述:通过设置可以启用我描述的行为(也是许多人中最直观的行为)hibernate.id.new_generator_mappings=true

谢谢大家。

更新2:
对于将来的读者,您可以在下面找到一个有效的示例。

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

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERS_SEQ")
    @SequenceGenerator(name = "USERS_SEQ", sequenceName = "SEQUENCE_USERS")
    private Long id;
}

persistence.xml

<persistence-unit name="testPU">
  <properties>
    <property name="hibernate.id.new_generator_mappings" value="true" />
  </properties>
</persistence-unit>

问题答案:

绝对清楚…您所描述的内容与规范没有 任何 冲突。该规范讨论的是Hibernate分配给您的实体的值,而不是实际存储在数据库序列中的值。

However, there is the option to get the behavior you are looking for. First
see my reply on Is there a way to dynamically choose a @GeneratedValue
strategy using JPA annotations and
Hibernate? That will give
you the basics. As long as you are set up to use that SequenceStyleGenerator,
Hibernate will interpret allocationSize using the “pooled optimizer” in the
SequenceStyleGenerator. The “pooled optimizer” is for use with databases that
allow an “increment” option on the creation of sequences (not all databases
that support sequences support an increment). Anyway, read up about the
various optimizer strategies there.



 类似资料:
  • 我有一个使用JPA注释生成数据库主键的代码。一个数据库序列用于使用Oracle DB生成PK.Am 现在我对此的理解是:DB sequencer返回的sequence id作为rec_id。这是正确的吗? 医生说: 序列策略序列策略由两部分组成——定义命名序列和在一个或多个类的一个或多个字段中使用命名序列。@Sequence Generator注释用于定义序列并接受名称、初始值(默认值为1)和分配

  • 我在一个配置为使用嵌入式H2数据库的spring应用程序中使用JPA。 我有一个用户实体定义如下: 上下文是这样定义的: 我可以从生成的日志中看到,生成了MY_SEQ。但是,initialValue和allocationSize会被完全忽略,序列不会分配给USER的id字段 因此,当data.sql文件尝试插入行时,我得到以下错误: 我错过了什么?

  • 问题内容: 我正在Oracle DB中插入一些记录。为了唯一,我正在使用SequenceGenerator。下面是代码: XxspPoInLineLocqty与XxspPoInLine具有@ManyToOne关系。当我坚持XxspPoInLine实体时,我收到以下错误: 我查看了stackoverflow,并为此找到了一些解决方案: 1.使用allocationSize = 1 因为我有5000+

  • 问题内容: 我将JPA2与Hibernate结合使用,并尝试为我的实体引入一个通用的基类。到目前为止看起来像这样: 但是,对于每个表,都有一个序列要用作序列生成器。我该如何在子类中进行设置?我想我需要重写@GeneratedValue并使用@SequenceGenerator创建一个新的SequenceGenerator。 问题答案: 是的,有可能。您可以使用注释覆盖默认的生成器名称。 基类 序列

  • 问题内容: 我有一个问题: 当应用程序启动时,它显示警告: WARN 7388 — [main] org.hibernate.orm.deprecation:HHH90000014:发现使用不推荐使用的[org.hibernate.id.SequenceHiLoGenerator]基于序列的id生成器;请改用org.hibernate.id.enhanced.SequenceStyleGenera

  • 是否可以使用Hibernate ORM和OGM创建单个应用程序?我创建了一个应用程序,我在一个应用程序中遇到了多个JPA的问题。我通过更改两个JPA的名称解决了这个问题,但两个JPA之间仍然存在冲突。以下是例外情况: 原因:org.springframework.beans.factory.无法将类型[org.hibernate.internal.SessionFactoryImpl]的参数值转换