Java 在JPA持久化单元中定义名为的重复生成器可以吗?

Java 在JPA持久化单元中定义名为的重复生成器可以吗?,java,hibernate,jpa,orm,hibernate-mapping,Java,Hibernate,Jpa,Orm,Hibernate Mapping,我的情况如下: 但是,我的问题不同,选择的答案无法解决问题: “即使使用多个同名@SequenceGenerator也有效吗?” 如果无效,是否有替代方案 非常感谢您的回答。我认为这是正确的,因为归根结底,hibernate将实体映射到序列,该序列将在数据库中持久化时生成ID。例如,Oracle不关心哪些表使用哪个序列,因为序列本身是一个独立的实体。依您使用的DBMS的不同,此警告(或错误)更有意义。在我看来,我只是在eclipse中禁用了错误警告。根据JPA2.1规范的11.1.48 Seq

我的情况如下:

但是,我的问题不同,选择的答案无法解决问题:

“即使使用多个同名@SequenceGenerator也有效吗?”

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


非常感谢您的回答。

我认为这是正确的,因为归根结底,hibernate将实体映射到序列,该序列将在数据库中持久化时生成ID。例如,Oracle不关心哪些表使用哪个序列,因为序列本身是一个独立的实体。依您使用的DBMS的不同,此警告(或错误)更有意义。在我看来,我只是在eclipse中禁用了错误警告。

根据JPA2.1规范的
11.1.48 SequenceGenerator注释部分:

发电机的范围 名称是持久性单元的全局名称(跨所有生成器类型)

所以你不能有重复的发电机

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

@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]


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

我认为这是有效的,因为最终,hibernate将实体映射到序列,该序列将在数据库中持久化ID时生成ID。例如,Oracle不关心哪些表使用哪个序列,因为序列本身是一个独立的实体。依您使用的DBMS的不同,此警告(或错误)更有意义。在我看来,我只是想禁用eclipse中的错误警告。谢谢你。您的评论可能是一个有效的答案。谢谢。因此,对于我的情况,我可以使用什么替代方案是无效的?唯一的解决方案是避免重复的生成器。如我的问题中所述,我有多个子类继承自一个抽象类BaseEntity,其中定义了@Id。如果我想为每个子类生成唯一的Id序列,我该怎么办?只需将@Id从基类移动到每个子类中。Hi@Vladmilcea,如果您将第二个生成器的增量大小的值更改为5,在这种情况下,两个生成器的参数相同,然后hibernate将不会显示错误。这在hibernate 5.13之后不再有效。Hibernate本身将在应用程序启动时引发异常。