【问题标题】:Play-2.2 Example @ManyToMany Relationship JavaPlay-2.2 示例 @ManyToMany 关系 Java
【发布时间】: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


    【解决方案1】:

    我自己回答了这个问题。简而言之:Play 不可能!将对象从它们的标识符自动绑定到列表。

    也许你会读到一些关于自定义 Databinder 或一些神奇的表单助手的内容。

    CustomDatabinder 很好,例如当您想要获得一个映射的单个复杂对象时

    用户.java

    公开工作 mainJob;

    如果您现在将 Job 的 ID 输入到 User 表单中,则自定义 Databinder 能够绑定数据(如果您提供了)。 但这不适用于列表

    事实上,唯一的办法就是使用一些样板代码。

    我就是这样做的

    User user = filledForm.get();
            List<Job> jobs = new ArrayList<Job>();
            for (Job job : user.getJobs()) {
                jobs.add(Job.find.byId(job.getId()));
            }
            user.create();
    

    表单绑定器将为用户中的作业列表生成作业列表。但是这些工作只是“存根”,我也曾遍历生成的工作,并通过在数据库中搜索它们来构建一个包含真实工作的列表。..

    不漂亮,但也不丑。

    也许这个解释可以帮助其他人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      • 2014-08-30
      • 2013-10-04
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多