6

我有一个名为 AbstractEntity 的类,它用 @MappedSuperclass 注释。然后我有一个名为 User (@Entity) 的类,它扩展了 AbstractEntity。这两者都存在于名为 foo.bar.framework 的包中。当我使用这两个类时,一切正常。但是现在我已经将一个包含这些文件的 jar 导入到另一个项目中。我想重用 User 类并用一些额外的字段来扩展它。我认为这样@Entity public class User extends foo.bar.framework.User可以解决问题,但我发现 User 的这个实现只继承了 AbstractEntity 的字段,但没有从 foo.bar.framework.User 继承。问题是,如何让我的第二个 User 类继承第一个 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”。字段“用户名”和“密码”没有创建到表中——这就是我遇到的问题。

4

1 回答 1

7

使用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;

    ...
}
于 2010-03-23T02:33:16.887 回答