【问题标题】:Vaadin Binding API and IdsVaadin 绑定 API 和 Id
【发布时间】:2018-10-24 16:56:30
【问题描述】:

我目前正在使用 Vaadin 10 和 Vaadin 绑定 API。基本上我想知道我必须做些什么来保存我的对象的 ID。假设我有一个表示数据库中实体的域对象。一旦加载或创建,它就有一个 id。

public class Person {
  private String id;
  private String name;
  // ...
}

在我看来,我有一个字段可以编辑我的域对象的名称和活页夹。

...
final TextField name = new TextField();
personBinder.bind(name, "name");
...

现在我该怎么处理 id?如果我保存并加载 bean (readBean/writeBean),id 就会消失。但是,我当然不想在我的视图中显示 id。我需要将它存储在我的视图类的新属性中吗?或者有什么技巧可以在活页夹中保留这些属性?如果我改用setBean/getBean,我似乎能够检索带有id的bean,但这似乎不对......

非常感谢您的问候!

编辑 1:

假设我有以下代码

TextField name = new TextField();
personBinder.bind(name, "name");
add(name);

Button button = new Button("Save", e -> {
    Person p = new Person();
    personBinder.writeBeanIfValid(p);
    System.out.println(p.getName());
    System.out.println(p.getId());
});
add(button);

Person p = new Person();
p.setName("John");
p.setId("42");

personBinder.readBean(p);

id,因为它没有绑定到任何字段,所以不会被保留。

【问题讨论】:

  • 当您说 id 消失时,我不确定我是否理解您的意思。是不是你传递给writeBean的实例的id被保留了?
  • 另一个问题:您写道,使用setBean/getBean 似乎不对。这是基于什么?
  • 您好,请看我帖子的第一次编辑。我不想使用 setBean/getBean,因为从外观上看,readBean/writeBean 方法执行附加操作。
  • “问题”是您将新创建的实例传递给writeBeanIfValid。使用它的预期方式是您要么将原始 bean 实例传递给它,要么显式地从数据库中获取一个新副本(这样就已经填充了 id)。

标签: java vaadin


【解决方案1】:

看来setBean/getBean的方式其实并没有错。至少 Vaadin 8 文档有一个使用它的示例。它列在“自动保存”下。因此,我上面的示例代码应该是这样的:

TextField name = new TextField();
personBinder.bind(name, "name");
add(name);

Button button = new Button("Save", e -> {
    if (personBinder.validate().isOk()) {
      Person p = personBinder.getBean();
      System.out.println(p.getName());
      System.out.println(p.getId());
    }
});
add(button);

Person p = new Person();
p.setName("John");
p.setId("42");

personBinder.setBean(p);

只要没有验证错误(这是事先检查的原因),字段中的值就会保存在 bean 中。当然,必须确保同一个 bean 不会在其他地方以某种方式被修改。

【讨论】:

    猜你喜欢
    • 2018-08-17
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    相关资源
    最近更新 更多