如果它们是假的,Ebean不会更新布尔值

时间:2016-01-03 12:21:58

标签: java sql playframework ebean

今天我在 Play Framework 中使用 Ebean 提出了一个非常奇怪的问题。我有多个带有一些布尔属性的模型。

如果我最初保存实体,一切正常。但是,当我编辑此类实体并将布尔值从 true更改为false 时,不会保存此类属性。我调查了Movie/MyMovie?searchTerm=Ant+Man&searchQ=1 SQL UPDATE中缺少所需的属性。无论如何,如果我编辑同一个实体并将相同的布尔属性从 false更改为true ,则更新工作正常。

看起来 Ebean 正在处理假布尔值,如果它是null值,所以它不会在UPDATE中考虑这样的属性。

我正在使用Java版本的Play 2.4.6和非默认的Ebean版本4.7.1。 (由于bug https://github.com/ebean-orm/avaje-ebeanorm/issues/309

,我被迫使用非默认版本的Ebean

2 个答案:

答案 0 :(得分:0)

好吧,我想出来了。不是Ebean问题。它是Play框架和HTTP处理的“按设计”行为。

问题在于从HTML表单绑定布尔值。当我勾选表单的复选框时,我从请求中获取值(类似于 id_of_checkbox = true )。当我没有勾选复选框时,请求中没有任何内容返回,因此未设置Entity属性。因此,Ebean认为属性没有改变,因此没有必要在SQL语句中包含这样的属性,因此它不会更新。

答案 1 :(得分:0)

这不仅是Play中的常见问题,也是其他框架和/或语言的常见问题。

幸运的是,有一个简单的技巧,可以在所有情况下解决它,只是在HTML代码中,隐藏输入的name属性与复选框相同,而某些值在复选框之前表示为false,因此您的代码最终应该看起来像:

<div>
    <input type="hidden" name="agreeBox" value="0" />
    <input type="checkbox" name="agreeBox" id="agreeBox"/>
    <label for="agreeBox">Do you agree?</label>
</div>

当然,如果您在视图中计划了许多复选框,则会更容易创建custom tag,这会在每个复选框中附加隐藏字段。

重要的游戏编辑!

In Play情况与我怀疑相反 - 如果有相同名称的字段仅使用 first ,则表示使用该技巧需要放置hidden输入< strong> AFTER 这样准备使用HTML的复选框应如下所示:

<div>
    <input type="checkbox" name="agreeBox" id="agreeBox"/>
    <label for="agreeBox">Do you agree?</label>
    <input type="hidden" name="agreeBox" value="0" />
</div>