使用POJO将复杂的JPA实体传递给控制器

时间:2011-04-01 14:00:42

标签: java jpa playframework pojo

我的团队正在编写一个涉及编辑类似维基百科的页面的应用程序。 它类似于我们注册时遇到的问题:

简单的实现提供类似

的内容
public static void doRegistration(User user) {
//...
}

用户参数是JPA实体。用户模型如下所示:

@Entity
public class User extends Model {

//some other irrelevant fields

@OneToMany(cascade = CascadeType.ALL)
public Collection<Query> queries;

@OneToMany(cascade = CascadeType.ALL)
public Collection<Activity> activities;
//...

我已阅读herethere,但此失败。现在,在Play!中,我们可以采取的最佳行动方案是什么?必须有一些方法可以将所有必须在服务器中传输的数据放在一个对象中,这很容易保存到数据库中。

编辑:失败的原因是验证失败。在验证集合对象时,它以某种方式说“不正确的值”。我想知道这是否可以避免。

解决方案:将集合更改为列表已解决了该问题。这是一个将在游戏1.2中修复的错误:)

事先谢谢

2 个答案:

答案 0 :(得分:1)

这是有效的。更清楚的是,您可以定义一个类似您编写的控制器方法:

public static void doRegistration(User user) {
//...
}

那完全没问题。只需将其映射到POST路由并使用#{form}提交对象,例如:

#{form id:'myId', action:@Application.doRegistration()}
   #{field user.id} 
   [...]
#{/form}

这很有效。如果您不在表单中添加实体的所有字段,则可能会出现问题(如果某些字段不可编辑,请使用隐藏的输入或No here所述的NoBinding注释。)

关于OneToMany主题的

编辑:,关系将由“多个”方管理。该方必须将相关实体的id保持为隐藏字段(值为object.user.id)。这将解决所有相关问题。

答案 1 :(得分:1)

它不会失败。如果你有一个正在运行的事务,整个事情将被保留。请注意,事务通常在服务中运行,而不是在控制器中运行,因此您应该将它从控制器传递到服务。