【问题标题】:Sequence Generator not available to child class (entity) in certain cases在某些情况下,子类(实体)无法使用序列生成器
【发布时间】:2019-05-30 09:58:59
【问题描述】:

我已经通过注释在继承关系中成功定义了一个序列生成器,大致如下:

@MappedSuperclass
public class DomainObject {
    @Id
    @Column( columnDefinition = "serial" )
    @GeneratedValue( generator = "id_sequence", strategy = GenerationType.IDENTITY )
    private long id = 0;
}

@Entity
@Table( name = "user" )
@SequenceGenerator( name = "id_sequence", sequenceName = "user_id_seq" )
public class User extends DomainObject {
}

在本例中,User 类的序列生成器从 DomainObject 中的 Generated value 注释中找到 id_sequence。

但是,如果我将 DomainObject 设为抽象类并将其置于另一个依赖项中(关于它的所有其他内容都保持不变),我会得到一个异常:

org.hibernate.AnnotationException: Unknown Id.generator: id_sequence

在更改后的版本中,DomainObject 依赖项位于 @ComponentScan 路径中,所以我不确定为什么这不起作用。有什么想法吗?

【问题讨论】:

    标签: java hibernate java-annotations


    【解决方案1】:

    你为什么不这样做:

    @MappedSuperclass
    public abstract class DomainObject {
       @Id
       @Column( columnDefinition = "serial" )
       @SequenceGenerator( name = "id_sequence", sequenceName = "user_id_seq" )
       @GeneratedValue( generator = "id_sequence", strategy = GenerationType.IDENTITY )
       private long id = 0;
    

    }

    @Entity
    @Table( name = "user" )
    public class User extends DomainObject {
    }
    

    我在其他项目中成功完成了这个配置...关于找不到带注释的类,请确保DomainObject在类路径中并且User实体确实被spring检测到...

    【讨论】:

    • 因为我不想对 DomainObject 的所有孩子使用相同的序列。 “用户”只是其中的一个例子。所以本质上,我想尽可能多地放入 DomainObject 并在孩子中定义 sequenceName = "user_id_seq"。
    • 我相信这是不可能的......因为你需要将@Id声明(包括其相关属性,即私有长id;)移动到每个子类......然后,你可以定义你想要的顺序
    • 这是我最初的假设。但是....我正在考虑的问题是:为什么序列的东西在我给出的第一个代码 sn-p 中工作(它在同一个包中的具体父类中)而不是不是在第二种情况下工作(我使父类抽象并让它驻留在单独的依赖项中)?只要父级不是抽象的并且在同一个包中,似乎 SequenceGenerator 确实可以在子级中,并且在父级中生成的Value。
    • 在可行的情况下,DomainObject 和 User 共享相同的包空间,即使每个类都在不同的工件(依赖)中声明?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多