今天我在 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答案 0 :(得分:0)
问题在于从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>