3

我是 Play Framework 2 的新手。我有 2 个模型:书籍和作者,一本书可以有很多作者,所以我认为它是多对多的。这是我的模型:

@Entity 
public class Book extends Model {

  @Id
  public Long id;

  @Constraints.Required
  public String title;

  @Constraints.Required    
  @ManyToMany(cascade=CascadeType.ALL,mappedBy="books") 
  public Set<Author> authors = new HashSet<Author>(); 
  public static Model.Finder<Long,Book> find = new Model.Finder<Long,Book>(Long.class, Book.class);

  public static Page<Book> page(int page, int pageSize, String sortBy, String order, String filter) {
      return 
        find.where()
            .ilike("title", "%" + filter + "%")                
            .orderBy(sortBy + " " + order)     
            .findPagingList(pageSize)
            .getPage(page);
  }

}

@Entity 
public class Author extends Model {

  @Id
  public Long id;

  @Constraints.Required
  public String name;

  @ManyToMany(cascade=CascadeType.ALL) 
  public Set<Book> books = new HashSet<Book>(); 

  public static Model.Finder<Long,Author> find = new Model.Finder<Long,Author>(Long.class, Author.class);

  public static Page<Author> page(int page, int pageSize, String sortBy, String order, String filter) {
      return 
        find.where()
            .ilike("name", "%" + filter + "%")
            .orderBy(sortBy + " " + order)                
            .findPagingList(pageSize)
            .getPage(page);
  }

}

我在输入表单中使用这个选择标签,如下所示:

<select name="authors.id" multiple="multiple">
  <option value="1">bejo</option>
  <option value="2">joko</option>
</select>

这是我的控制器代码:

Map<String, String> newData = new HashMap<String, String>();
Map<String, String[]> urlFormEncoded = play.mvc.Controller.request().body().asFormUrlEncoded();
if (urlFormEncoded != null) {
  for (String key : urlFormEncoded.keySet()) {
    String[] value = urlFormEncoded.get(key);
    if (value.length == 1) {                    
      newData.put(key, value[0]);
    } else if (value.length > 1) {
      for (int i = 0; i < value.length; i++) {
        newData.put(key + "[" + i + "].id", value[i]);          
      }
    }
  }
}        
Form<Book> bookForm = new Form<Book>(Book.class).bind(newData);
if(bookForm.hasErrors()) {
 return badRequest(createForm.render(bookForm));
}
bookForm.get().save();

但这些代码不起作用。一些身体可以帮助我吗?谢谢

4

1 回答 1

2

不要根据需要注释您的关系,而是在项目保存尝试时执行检查:

public static Result saveBook() {
    Map<String, String[]> formUrlEncoded = request().body().asFormUrlEncoded();
    Form<Book> bookForm = form(Book.class).bindFromRequest();
    Set<Author> authors = new HashSet<Author>();

    // iterate through the keys to find values and pre-fill required Set(s)
    for (String key : formUrlEncoded.keySet()) {
        String[] values = formUrlEncoded.get(key);
        for (String val : values) {
            if ("authors.id".equals(key)) authors.add(Author.find.ref(Long.valueOf(val)));
        }
    }

    // Check if form hasn't errors and if it contains authors
    if (bookForm.hasErrors() || authors.size() < 1) {
        return badRequest(createForm.render(bookForm));
    }

    // Create a Book, fill with data from form, add relations, save
    Book book = new Book();
    book = bookForm.get();
    book.authors = authors;
    book.save();

    flash("generalInfo", "Book saved, thank you!");
    return redirect(routes.Application.index());
}
于 2012-11-25T08:50:59.823 回答