我无法在Java中找到与Play-2.2设计ManyToMany关系的完整示例。 我的问题是,我无法使用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;
}
}
User.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()
没有任何作用。所以,任何人都知道我做错了什么,或者我不知道怎么玩!?如果不在每个我想处理具有manyToMany关系的模型的Controller中编写巨大的样板代码代码,也许不可能做到这一点? 因为我知道我可以“手动”解析控制器中的表单数据并强制将jobs-List放入用户。但这对于像Play这样的MVC框架来说不是正确的方法: - )
谢谢
顺便说一句,在Play-Documentation / GitHub中甚至没有一个例子/样本,其中出现“ManyToMany”一词......
真的,我只是需要一些不完全性交的方式来处理ManyToMany关系(如果我不能使用复选框..好吧,如果我应该使用别的东西,好的....我只需要一些方法让它工作)
答案 0 :(得分:0)
我自己回答了这个问题。简而言之:玩游戏是不可能的!将对象从其标识符自动绑定到列表。
也许您会阅读有关自定义Databinder或一些神奇形式助手的内容。
如果要获取映射的SINGLE复杂对象
,则CustomDatabinder很好User.java
public Job mainJob;
如果您现在在“用户”表单中输入作业的ID,则自定义数据仓可以绑定数据(如果您提供了数据)。 但这不适用于List
实际上唯一的事情是使用一些样板代码。
我这样做了
User user = filledForm.get();
List<Job> jobs = new ArrayList<Job>();
for (Job job : user.getJobs()) {
jobs.add(Job.find.byId(job.getId()));
}
user.create();
表单活页夹将为用户中的作业列表生成作业列表。但是这些工作只是“存根”,我已经迭代了生成的工作,并通过在数据库中搜索它们来构建一个真实的列表。
它不漂亮,但也不太难看。
也许这种解释可以帮助别人。