【问题标题】:How to deal with a bean containing @Id @GeneratedVaule in Vaadin?如何在 Vaadin 中处理包含 @Id @GeneratedVaule 的 bean?
【发布时间】:2014-10-09 06:48:32
【问题描述】:

我正在尝试制作一个将数据发送到 Vaadin 数据库的表单。

Bean Person.java 是一个典型的JavaBean:

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person implements Serializable {

@Id
@GeneratedValue
private Long id;
private String firstName;
private String lastName;

public Person(Long id, String firstName, String lastName) {
    this.id = id;
    this.firstName = firstName;
    this.lastName = lastName;
}

public Person() {
}

-- getters and setters --

Vaadin FieldGroup 如下所示:

FieldGroup fieldGroup = new BeanFieldGroup<Person>(Person.class);

// from the tutorial: "We need an item data source before we create the fields to be able to
// find the properties, otherwise we have to specify them by hand"
fieldGroup.setItemDataSource(new BeanItem<Person>(new Person(1L,
     "John", "Doe")));

for (Object propertyId : fieldGroup.getBoundPropertyIds()) {
    layout.addComponent(fieldGroup.buildAndBind(propertyId));
}

页面上什么都没有。什么都没有生成,没有表单域。我错过了什么吗?老实说,我对 Vaadin 完全陌生。另一方面,我想知道如何处理 ID 字段。它是自动生成的,所以用户对这个值没有任何影响......我迷路了。

【问题讨论】:

    标签: java database jpa vaadin vaadin7


    【解决方案1】:

    我的建议是这样的:

    public class MyUI extends UI {
    
        @Override
        protected void init(VaadinRequest request) {
            VerticalLayout layout = new VerticalLayout();
            FieldGroup fieldGroup = new BeanFieldGroup<Person>(Person.class);
            fieldGroup.setItemDataSource(new BeanItem<Person>(new Person(1L, "John", "Doe")));
            for (Object propertyId : fieldGroup.getUnboundPropertyIds()) {
                Field<?> field = fieldGroup.buildAndBind(propertyId);
                if ("id".equals(propertyId)) {
                    field.setReadOnly(true);
                }
                layout.addComponent(field);
            }
            setContent(layout);
        }
    
    }
    

    您应该使用getUnboundPropertyIds(),因为在迭代之前您没有将任何 propertyId 绑定到字段。

    【讨论】:

    • 感谢您的帮助,但仍然没有显示表单... Netbeans 说 addComponent 方法不存在。使用layout.addComponent(field) 也无济于事。
    • @dziki 父类是什么类型的?
    • 对不起,tbh,我现在学习 Java 不到 3 个月,所以我不完全确定如何回答你的问题......所以我会附上前几行我正在尝试将表单放入的类:public class MyVaadinUI extends UI { @WebServlet(value = "/*", asyncSupported = true) @VaadinServletConfiguration(productionMode = false, ui = MyVaadinUI.class, widgetset = "com.smtsoftware.nitecki.vaadin2test.AppWidgetSet") public static class Servlet extends VaadinServlet { } @Override protected void init(VaadinRequest request) {
    • @dziki 我扩展了我的答案。
    • 感谢您的回答,表格终于出来了。我不想询问我需要的一切,但现在我必须使用 Spring + Hibernate 来解决这个问题,添加一个“提交”按钮,将数据保存在数据库中。我很确定我知道如何使用 JPA 编写类和方法来保存数据(我在 JSF 中做过几次 - 但没有任何 spring 和 hibernate 的痕迹)。给我一个建议——我应该从哪里开始寻找?以及如何使用来自负责持久化的 java 类的方法添加这个 SUBMIT 按钮? :D
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 2010-12-22
    • 2015-09-23
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多