代码之家  ›  专栏  ›  技术社区  ›  Mauricio

jpa@tablegenerator在多个实体之间共享

  •  6
  • Mauricio  · 技术社区  · 14 年前

    我有一个带有@id和@tablegenerator的“狗”实体

    ...
    @TableGenerator(table = "seq", name = "dog_gen", pkColumnName = "seq_name", valueColumnName="seq_val")
    @Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "dog_gen")
    private Long id;
    ...
    

    是否有方法在其他实体中重用相同的表生成器(dog_gen)?我想在两个独立的实体中保持相同的ID序列,比如

    犬=1, 犬=2, 犬=3, 猫=4, 猫=5, 犬=6 等等…

    两个实体都不共享一个公共超类来实现ID属性的某种继承。

    如果我添加 @GeneratedValue(Generator=“Dog_Gen”) 在我的cat实体上,省略@tablegenerator声明会引发一个异常,说明它在启动上下文时找不到生成器。

    Caused by: org.hibernate.AnnotationException: Unknown Id.generator: dog_gen
    at org.hibernate.cfg.BinderHelper.makeIdGenerator(BinderHelper.java:413)
    at org.hibernate.cfg.AnnotationBinder.bindId(AnnotationBinder.java:1795)
    at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1229)
    at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:733)
    at org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:498)
    at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:277) 
    
    1 回复  |  直到 14 年前
        1
  •  3
  •   Pascal Thivent    14 年前

    事实上,这并不是我在读了 @TableGenerator :

    此注释定义了一个主键生成器,当为 GeneratedValue 注释。可以在实体类或主键字段或属性上指定表生成器。 生成器名称的范围是持久性单元的全局范围 (所有发电机类型)。

    也许我没有正确地解释问题(JPA规范的9.1.38节没有告诉我们更多),但我希望能够从 @GeneratedValue .

    不管怎样,以下内容似乎有效。在 Dog 实体:

    @TableGenerator(table = "myseq", name = "dog_gen", pkColumnName = "seq_name", 
          valueColumnName = "seq_val", pkColumnValue = "Dog", allocationSize = 1)
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "dog_gen")
    private Long id;
    

    而在 Cat 嗯,同样的:

    @tablegenerator(table=“myseq”,name=“dog_gen”,pkcolumnname=“seq_name”,
    valuecolumnname=“seq_val”,pkcolumnvalue=“dog”,分配大小=1)
    @身份证
    @generatedvalue(策略=generationtype.table,generator=“dog_gen”)
    私人长ID;