2012-11-19 47 views
4

我有一个扩展了Model的User类和两个我想扩展User类的类。Play Framework - 如何从超类继承?

User.java:

@Entity 
@Table(name = "users") 
public class User extends Model implements RoleHolder { 

    private static final long serialVersionUID = 1L; 

    @Id 
    public Long id; 

... 

Driver.java:

public class Driver extends User { 
... 

Customer.java:

public class Customer extends User { 
... 

编辑 所有三个实体都需要直接访问。换句话说,我有用户,客户和驱动程序;客户和驱动程序恰好共享用户的所有属性。因此,我需要有一个有效的用户实体以及客户和驱动程序。

我需要能够获得所有用户(包括客户和驱动程序)的列表。

我一直无法弄清楚如何在Play中使用ebean进行这项工作。我怎样才能做到这一点?

+0

对不起,确切的问题是什么?你的意思是不能直接使用用户? – emt14

回答

3

要保持User表具体,您可以使用@Inheritance注释。有关这方面的讨论见Play Framework 2 Ebean and InheritanceType as JOINED

也有可能是手动加入使用@OneToOne驱动程序和客户附配表。

使用@OneToOne也将有利于构成而不是继承,这被认为是一种好的做法。

+1

感谢萨穆埃尔一个新的答案,我找到'@ OneToOne'前试过了'@ Inheritance'轨道。我走了那条路,我的问题解决了。谢谢! –

3

这可能是MappedSuperClass注释的用例。有关文档,请参阅http://docs.oracle.com/javaee/5/api/javax/persistence/MappedSuperclass.html。据推测,这是由Ebean支持的,尽管缺乏有关它的文档。

+1

感谢塞缪尔,不幸的是,MappedSuperClass不允许用户实体存在。如果我只需要访问子类,这是完美的解决方案! –

+0

然后有一个'AbstractUser'超(MappedSuperClass)和'User'以及其他人继承它 - 这是我不明白你为什么会确实需要使用'User'如此也。 – Samuel

+0

与你的建议的AbstractUser类的问题是,如果我想用户的完整列表,我必须做三个查询,一个是用户,一个是客户的,一个用于驱动程序。在我的模型中,客户是一个用户,一个驱动程序是一个用户。 –