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

扩展实体

  •  4
  • KCL  · 技术社区  · 16 年前

    我有一个名为abstractEntity的类,它用@mappedSuperClass注释。然后我有一个名为user(@entity)的类,它扩展了abstractentity。这两者都存在于名为foo.bar.framework的包中。当我用这两门课的时候,一切都很好。但现在我已经将包含这些文件的JAR导入到另一个项目中。我想重用这个用户类,并用一些额外的字段扩展它。我想 @Entity public class User extends foo.bar.framework.User 会这样做,但我发现用户的这个实现只继承AbstractEntity中的字段,而不继承foo.bar.framework.user中的字段。问题是,如何让第二个用户类继承第一个用户实体类中的所有字段?

    两个用户类实现都具有用@table(name=“name”)定义的不同表名。

    我的课看起来像这样

    
    package foo.bar.framework;
    
    @MappedSuperclass
    abstract public class AbstractEntity {
    
       @Id
       @GeneratedValue(strategy = GenerationType.AUTO)
        protected Long id;
    
        @Column(nullable = false)
        @Version
        protected Long consistencyVersion;
    
        ...
    }
    
    
    
    package foo.bar.framework;
    
    @Entity
    @Table(name = "foouser")
    public class User extends AbstractEntity {
    
        protected String username;
    
        protected String password;
    
        ....
    }
    
    
    
    package some.application;
    
    @Entity
    @Table(name = "myappuser")
    public class User extends foo.bar.framework.User {
    
        protected String firstname;
    
        protected String lastname;
    
        protected String email;
    
        ....
    }
    
    

    使用上面的代码,eclipseLink将创建一个名为“myappuser”的表,其中包含字段“id”、“consistencyversion”、“firstname”、“lastname”和“email”。字段“username”和“password”不是为表创建的,这就是我遇到的问题。

    1 回复  |  直到 16 年前
        1
  •  5
  •   Pascal Thivent    16 年前

    对于JPA,默认继承策略(即未指定时)是 SINGLE_TABLE :每个继承层次结构只有一个表,并且所有字段都保留在基类的表中。

    如果要为继承层次结构中的每个类都创建一个表,并且每个表包含所有继承字段的列,则需要使用 TABLE_PER_CLASS 战略。

    package foo.bar.framework;
    
    @MappedSuperclass
    @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
    abstract public class AbstractEntity {
    
       @Id
       @GeneratedValue(strategy = GenerationType.AUTO)
        protected Long id;
    
        @Column(nullable = false)
        @Version
        protected Long consistencyVersion;
    
        ...
    }