【问题标题】:Extending an entity扩展实体
【发布时间】:2010-03-21 19:45:26
【问题描述】:

我有一个名为 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; @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”。 “用户名”和“密码”字段未创建到表中 - 这就是我遇到的问题。

【问题讨论】:

  • 你如何确认它只继承了abstractuser的字段?
  • 请展示更多代码并解释您的期望和获得的结果(在 Java 级别和 db 级别)。
  • @Bazho,我将我的代码与实际的数据库表进行了比较。 @Pascal Thivent,我已包含您要求的信息。

标签: java jpa eclipselink


【解决方案1】:

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

    ...
}

【讨论】:

  • 这是正确的,但这并没有完全解决我的问题。似乎我不能拥有两个同名的实体(即使它们位于不同的包中)。这意味着框架的 User 表没有被创建,实际上,EclipseLink 似乎完全忽略了它。为了解决我的问题,我不得不重命名另一个用户实体类并按照您的建议进行更改。
猜你喜欢
  • 2021-03-22
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
相关资源
最近更新 更多