2014-10-18 54 views
0

我从播放框架开始并遇到以下问题。在框架中使用外键时发生框架:[IllegalStateException:No value]

情况:我的应用程序有两个表,培训师和培训(1:n)。

我的模型: Trainer.java

@Entity 
public class Trainer extends Model { 
    @Id 
    public Long id; 
    @Constraints.Required 
    public String trainerShortcut; 
    @Constraints.Required 
    public String firstName; 
    @Constraints.Required 
    public String lastName; 
    @Constraints.Required 
    public String email; 
    @OneToMany(mappedBy="owner", cascade=CascadeType.ALL) 
    public List<Training> trainings; 
    ... 

Training.java

@Entity 
public class Training extends Model { 
    @Id 
    public Long id; 
    public String shortcut; 
    public String name; 
    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="owner_id") 
    public Trainer owner; 
    public String description; 
    ... 

我也产生在Eclipse的getter和setter。

我的控制器:

public static Result addTraining() { 
    Training training = Form.form(Training.class).bindFromRequest().get(); 
    training.save(); 
    return ok(); 
} 

的情况:我有添加训练一个简单的形式,这种形式包括“所有者”输入包含一个教练ID。

如果我使用Eclipse生成二传手“setowner”,我得到下面的执行异常(尽管有与数据库中给出的ID教练):

[IllegalStateException异常:无值]

线

培训培训= Form.form(Training.class).bindFromRequest()得到()。 被引用为

如果我删除了Eclipse生成的setter,则训练表中的“owner_id”字段之后为NULL。

我在做什么错?

非常感谢

回答

1

从您的文章清楚地表明它在Training.javaowner财产指Trainer模型预计Trainer对象,但只得到该用户为owner输入提供Trainer's id,那是问题的根源。

要解决此问题,您需要使用链接末尾解释的custom DataBinder

之前结合的形式,你需要custom DataBinder注册,将采取转换id照顾到Trainer

public static Result validate(){ 
    Formatters.register(Trainer.class, new Formatters.SimpleFormatter<Trainer>(){ 
     @Override 
     public Trainer parse(String input, Locale arg1) throws ParseException { 
      Trainer trainer = Trainer.find.byId(new Long(input)); 
      return trainer; 
     } 

     @Override 
     public String print(Trainer trainer, Locale arg1) { 
      return trainer.id.toString(); 
     } 
    }); 

    Training training = Form.form(Training.class).bindFromRequest().get(); 
    training.save(); 
    return ok(); 
} 
+1

我解决了也只是在不久前由“主人”到“所有者重命名表单输入.id“,但你的解决方案也适用! 我只是不得不使用“Ebean.find(Trainer.class,input)”而不是Trainer.find.byId,这是因为使用Ebean,我猜? – user844513 2014-10-19 11:33:41