2010-03-21 187 views
4

我有一个名为AbstractEntity的类,它用@MappedSuperclass注解。然后我有一个名为User(@Entity)的类,它扩展了AbstractEntity。这两个都存在于名为foo.bar.framework的包中。当我使用这两个类时,一切正常。但现在我已经将包含这些文件的jar导入到另一个项目中。我想重复使用User类并用一些附加字段进行扩展。我认为@Entity public class User extends foo.bar.framework.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” 表, “名字” ,“姓氏”和“电子邮件”。 “用户名”和“密码”字段不会创建到表格 - 这就是我遇到的问题。

+1

你怎么确认它从abstractuser只继承领域? – Bozho 2010-03-21 19:58:55

+1

请展示更多代码并解释您期望的内容以及您获得的内容(在Java级别和数据库级别)。 – 2010-03-21 20:21:51

+0

@Bazho,我将我的代码与实际的数据库表进行了比较。 @Pascal Thivent,我已经包含了你所要求的信息。 – 2010-03-22 05:21:45

回答

4

对于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; 

    ... 
} 
+1

这是正确的,但是这并没有完全解决我的问题。似乎我不能有两个同名的实体(即使它们在不同的包中)。这意味着框架的用户表没有被创建,实际上,EclipseLink似乎完全忽略了它。要解决我的问题,我必须重命名其他用户实体类,并执行您所建议的更改。 – 2010-03-25 05:31:34