我有一个名为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实体类的所有字段?

两种User类实现都有使用@Table(name =“name”)定义的不同表名。

我的课看起来像这样
package foo.bar.framework;@MappedSuperclassabstract 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”。没有为表创建“用户名”和“密码”字段-这就是我遇到的问题。

最佳答案

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

    ...
}

09-10 08:04
查看更多