Java 在JPA持久化单元中定义名为的重复生成器可以吗?
我的情况如下: 但是,我的问题不同,选择的答案无法解决问题: “即使使用多个同名@SequenceGenerator也有效吗?” 如果无效,是否有替代方案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
非常感谢您的回答。我认为这是正确的,因为归根结底,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本身将在应用程序启动时引发异常。