代码之家  ›  专栏  ›  技术社区  ›  Nathan Feger

父类中@id和基类中唯一序列的正确JPA映射是什么?

  •  9
  • Nathan Feger  · 技术社区  · 15 年前

    我有一个类层次结构:

    abstract DomainObject {
    ...
        @Id
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SEQ")
        @SequenceGenerator(name="SEQ",sequenceName="SEQ_DB_NAME")
        @Column(name = "id", updatable = false, nullable = false)
        private Long id;
    ...
    }
    
    BaseClass extends DomainObject {
    ...
       // Fill in blank here where this class's @Id will use a unique sequence generator
       // bonus points for any sort of automatic assignment of generator names that might 
       //prevent me from having to instrument all my domain objects uniquely
    ...
    }
    

    笔记:

    • 我不特别需要一个基类生成器,所以如果需要我删除它,那就没问题了。
    • 这是Oracle 9i数据库(如果适用)
    • 休眠3.4 JPA
    • 弹簧2.5也可用

    谢谢

    2 回复  |  直到 15 年前
        1
  •  8
  •   Nathan Feger    15 年前

    好吧,下面是我解决问题的方法:

    基类:

    @MappedSuperclass
    public abstract class DomainObject implements Serializable {
     @Id
     @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SEQ")
     @Column(name = "id", updatable = false, nullable = false)
     private Long id;
    
     .. rest of class
    }
    

    后代类:

    @Entity
    @SequenceGenerator(name="SEQ",sequenceName="SEQ_DB_NAME")
    public class BusinessObject extends DomainObject {
    
     ...
    
    }
    
        2
  •  0
  •   Chris Dail    15 年前

    我建议您为基类使用联接继承类型。这会将所有公共字段放在基表中,而自定义项放在特定表中。以下是注释:

    @Inheritance(strategy=InheritanceType.JOINED)
    

    完成后,几乎可以使用任何排序选项,因为所有ID都始终在同一个表上。如果需要,可以使用单独的序列,但并非所有数据库供应商都支持该序列。我想这不是问题,因为您是专门使用Oracle的。

    我用过这个,而且效果很好。

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;