选择未填充从其他表映射的值的选项

时间:2013-04-07 01:25:09

标签: java playframework playframework-2.0

我有两个模型MoviePlace之间的映射。 当我现在创建一个来自movieForm并填写已创建的Movie然后打开一个包含movieForm所有文本字段和选择字段的视图时,填充除{{1}之外的值到Place。 在下面的示例中,在视图中的“选择”中正确选择了类别,但未选择该位置。

可能是什么问题? 我该如何解决这个问题?


电影模型

Movie

放置模型

@Entity
public class Movie extends Model {

    @Id
    public Long id;
    ...
    @Required
    @Formats.NonEmpty
    public EnumCategorie categorie = EnumCategorie.FILM;
    @ManyToOne
    public Place place;

    ...
}

控制器

@Entity
public class Place extends Model {
    @Id
    public String name;
    ...
}

视图

public class Movies extends Controller {
    public static Result edit(Long id) {
        Movie movie = Movie.find.byId(id);
        Form<Movie> movieForm = form(Movie.class).fill(movie);
        return ok(movieCreate.render(movieForm,
                placeForm, "edit"));
    }

1 个答案:

答案 0 :(得分:0)

我猜你错过了Place.java模型上的这行代码。该模型可能如下所示:

放置模型

@Entity
public class Place extends Model {
   @Id
   public String name;

   ... // the rest of fields

   // Sample of all Places data as value of select option in views
   public static List<String> places() {
      List<String> all = new ArrayList<>();
      all.add("INA"); // Place.name = "INA"
      all.add("BEL"); // Place.name = "BEL"
      all.add("KOR"); // Place.name = "KOR"
      return all;
   }

   // You missed this 
   public String toString() {
      return name; // return Place.name
   }
}

好的,现在这是解释。让我们看看您的视图代码:

@select(movieForm("place"), options(Place.places), ...)

options(...)仅适用于以下数据类型(取自play2源代码):

def apply(options: (String, String)*) = ...
def apply(options: Map[String, String]) = ...
def apply(options: java.util.Map[String, String]) = ...
def apply(options: List[String]) = ...
def apply(options: java.util.List[String]) = ...

因为Movie类上的地点字段是Place对象而不是String对象,所以它应该表示为String。您可以定义它的方法是覆盖toString()对象上的Place方法,因此它代表Place.name模型{ {<1}}模型的ID )作为视图中选择选项的值(指使用Place填充的数据)。

希望这有助于解决您的问题。


更新

如果我们选择不覆盖模型上的Place.places()方法,我们也可以执行以下操作:

toString()

`@select(movieForm("place.name"), options(Place.places), ...)` 可用于绑定movieForm("place.name")对象,其ID值可直接输入值。 This related question可以作为此解决方案的参考。