我在处理表单中的继承模型时遇到问题。这是一个简单的例子来理解我的问题。
类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添加到数据库中吗?
答案 0 :(得分:0)
虽然你使用的是List<User>
,但它有点问题,但Java会将其识别为实例的Employee
,所以你需要强制转换 Employee
至User
(如果对象仅包含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());