使用模板中的继承来播放Framework 2.2

时间:2014-05-02 14:47:25

标签: playframework playframework-2.2

我在处理表单中的继承模型时遇到问题。这是一个简单的例子来理解我的问题。

类User有两个子类Employee和Admin。

User.java

@Entity
@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
public class User extends Model {
 ...
}

Employee.java

@Entity
@DiscriminatorValue("employee")
public class Employee extends User{
    ...
}

Admin.java

@Entity
@DiscriminatorValue("admin")
public class Admin extends AnalysisProcedure {
 ...
}

现在我想将多个用户分配给带有List的项目。该列表应包含Employee或Admin的对象。

Project.java

@Entity
public class Project extends Model {

public List<User> users;

}

Web界面的生成如下:

@repeat(projectForm("users")) { user =>
    <tr>
        <td>
            @inputText(user("name"))
        </td>
        ...
    <tr>
}

显示提交无错误,但数据库中也没有新对象。在调试代码时,我看到新用户的实例是User。

Projets.java(Controller)

...
Project project = formProject.get();
List<User> users = project.users;

for(User user : users){
    // the user is everytime instance of User
}
...

现在我的问题是如何在Web界面中处理这种继承,因此可以将Employee或Admin添加到数据库中吗?

1 个答案:

答案 0 :(得分:0)

虽然你使用的是List<User>,但它有点问题,但Java会将其识别为实例的Employee,所以你需要强制转换 EmployeeUser(如果对象仅包含id字段,则保存足够的关系。

对于在Ebean中保存关系的非常类似的问题,我们在User模型中创建了简单的 cast 方法,不管怎么说都没有按预期工作:

public User asUser() {
    User user = new User();
    user.id = this.id;
    return user;
}

案例:

Employee employee = Employee.find.byId(123);

// This doesn't work:
project.users.add(employee);


// This works:
project.users.add(employee.asUser());