【问题标题】:Is it OK to have a duplicate generator named defined in the JPA persistence unit?在 JPA 持久性单元中定义一个名为的重复生成器是否可以?
【发布时间】:2016-04-19 18:10:50
【问题描述】:

这里描述了我的情况:

eclipse Duplicate generator named "ID_GENERATOR" defined in this persistence unit

但是我的问题不同,选择的答案没有解决它:

有多个@SequenceGenerator 同名是否有效,即使它用于此目的Hibernate : How override an attribute from mapped super class

如果无效,是否有替代方案?

非常感谢您的回答。

【问题讨论】:

  • 我认为它是有效的,因为归根结底,这就是休眠将实体映射到将生成 ID 的序列的方式,该序列将其持久保存在数据库中。例如,Oracle 不关心哪些表使用哪个序列,因为序列本身是一个独立的实体。根据您使用的 DBMS,IMO 这个警告(或错误)更有意义。 IMO,我只是在 Eclipse 中禁用错误​​警告。
  • 谢谢利奥。您的评论可能是一个有效的答案。

标签: java hibernate jpa orm hibernate-mapping


【解决方案1】:

根据 JPA 2.1 规范的11.1.48 SequenceGenerator Annotation 部分:

生成器的范围 name 对于持久性单元是全局的(跨所有生成器类型)。

所以你不能有重复的生成器。

如果您尝试添加以下两个实体:

@Entity(name = "Post")
public static class Post {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "pooled")
    @GenericGenerator(
        name = "pooled",
        strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
        parameters = {
            @Parameter(name = "sequence_name", value = "sequence"),
            @Parameter(name = "initial_value", value = "1"),
            @Parameter(name = "increment_size", value = "5"),
        }
    )
    private Long id;
}

@Entity(name = "Announcement")
public static class Announcement {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "pooled")
    @GenericGenerator(
            name = "pooled",
            strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
            parameters = {
                @Parameter(name = "sequence_name", value = "sequence"),
                @Parameter(name = "initial_value", value = "1"),
                @Parameter(name = "increment_size", value = "10"),
            }
    )
    private Long id;
}

Hibernate 会产生以下错误信息:

遇到对数据库序列 [sequence] 的多次引用 试图为“增量大小”设置冲突值。找到 [10] [5]

这是因为标识符生成器是全局的,这两个序列配置会发生冲突。

【讨论】:

  • 谢谢。因此,对于我的情况,我可以使用哪些替代方案无效?
  • 唯一的解决办法是避免重复生成器。
  • 正如我的问题中所述,我有多个子类继承自抽象类 BaseEntity ,其中定义了@Id。如果要为每个子类生成唯一的Id序列该怎么办?
  • 只需将@Id 从基类移动到每个子类中。
  • 嗨@VladMihalcea,如果您将第二个生成器的 increment_size 的值更改为 5,在这种情况下,两个生成器具有相同的参数,那么休眠将不会显示错误。
【解决方案2】:

我认为这是有效的,因为归根结底,这就是 hibernate 将实体映射到将生成 ID 的序列的方式,该序列将其持久保存在数据库中。例如,Oracle 不关心哪些表使用哪个序列,因为序列本身是一个独立的实体。根据您使用的 DBMS,IMO 这个警告(或错误)更有意义。 IMO,我只是在 Eclipse 中禁用错误​​警告。

【讨论】:

  • 这在 Hibernate 5.13 之后不再有效。 Hibernate 本身会在应用程序启动时抛出异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2013-02-15
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多