【发布时间】:2014-05-15 23:08:23
【问题描述】:
我找不到一个完整的例子来用 Java 中的 Play-2.2 设计多对多关系。 我的问题是,我无法让 Form-to-Model 绑定在我的 ManyToMany 关系上工作......
有很多用户。一个用户可以有很多工作。 有很多工作。一项工作可以“拥有”许多成员/参与者(用户)。
Job.java
@Entity
public class Job extends TimmeeyModel {
@Constraints.Required
@Column(unique = true)
public String jobName;
@ManyToMany(mappedBy="jobs")
public List<User> members = new ArrayList<User>();
public static Finder<Long,Job> find = new Finder<Long, Job>(Long.class,Job.class);
@Override
public Job create(){
this.save();
return this;
}
@Override
public Job update(Long id){
Job oldJob = find.byId(id);
oldJob.setJobName(this.getJobName());
oldJob.setMembers(this.getMembers());
oldJob.save();
oldJob.refresh();
return oldJob;
}
@Override
public void delete(){
this.delete();
}
public String toString(){
String userString ="";
for (User user : members) {
userString+=user.getUsername() +", ";
}
return jobName + ", " + id +" " + userString;
}
}
用户.java
@Entity
public class User extends TimmeeyModel {
@Constraints.Required
@Column(unique = true)
public String username;
@ManyToMany(cascade=CascadeType.PERSIST)
public List<Job> jobs = new ArrayList<Job>();
public static Finder<Long, User> find = new Finder<Long, User>(Long.class, User.class);
public String getEmail(){
return this.username + "@pool.math.tu-berlin.de";
}
@Override
public User create(){
//jobs.add(Job.find.all().get(0));
this.save();
return this;
}
@Override
public User update(Long id){
User user = find.ref(id);
user.setUsername(this.getUsername());
user.setUsername(this.getUsername());
user.save();
user.refresh();
return user;
}
public void delete(){
this.delete();
}
public String toString(){
String jobString = "";
for (Job job : jobs) {
jobString += job.toString() + ", ";
}
return "User Id: " + id + " "+username + "Jobs: " + jobString;
}
UserController.java
public static Result showCreate(){
return ok(views.html.user.add.render(Job.find.all(), userForm));
}
public static Result create(){
Map<String, String> newData = new HashMap<String, String>();
Form<User> filledForm = userForm.bind(newData);
if(filledForm.hasErrors()) {
return badRequest("Leider nein" + filledForm.toString());
} else {
String logString = filledForm.toString();
User user = filledForm.get();
user.create();
return ok(user.toString() + logString);
}
}
视图 scala 模板
@form(routes.Users.create()) {
@inputText(userForm("username"))
@for((value,index) <- jobs.zipWithIndex ) {
<input type="checkbox" name="jobs[]" value="@value.getId()">@value.getJobName()</input>
}
我只是无法让它工作。提交用户的 Joblist 后保持为空。但是,当我在用户对象中设置“硬编码”列表时,它会保留在那里并按预期工作。所以我认为这与某些 db/config 问题无关。所以我怀疑将表单数据绑定到用户模型时出现问题。 我也尝试了不同版本的表格,比如 @value.getJobName() @value.getJobName() @value.getJobName() @value.getJobName()
没有任何作用。那么有谁知道我做错了什么,或者我对游戏不了解!?如果不在每个我想处理具有多对多关系的模型的控制器中编写大量样板代码,也许不可能做到这一点? 因为我知道我可以“手动”解析控制器中的表单数据并将作业列表强制放入用户中。但这对于像 play 这样的 MVC 框架来说不是正确的方法:-)
谢谢
顺便说一句,Play-Documentation/GitHub 中甚至没有一个示例/示例出现“ManyToMany”一词...
真的,我只需要一些不完全搞砸的方法来处理多对多关系(如果我不能使用复选框..好吧,如果我应该使用其他东西,好吧....我只需要一些方法让它工作)
【问题讨论】:
标签: java playframework playframework-2.0