更改 sqlcontainer 中的属性时出现 java.sql.SQLIntegrityConstraintViolationException - Vaadin

Posted

技术标签:

【中文标题】更改 sqlcontainer 中的属性时出现 java.sql.SQLIntegrityConstraintViolationException - Vaadin【英文标题】:java.sql.SQLIntegrityConstraintViolationException when changing a property in sqlcontainer - Vaadin 【发布时间】:2013-10-08 10:10:01 【问题描述】:

您好,我在尝试更改 sql 容器中新添加项目的属性时遇到 SQLIntegrityConstraintViolationException。我有一个非常简单的表格:

CREATE TABLE person(
id int not null primary key,
name varchar(30),
surname varchar(30),
age int
)

我正在尝试一个一个地设置所有属性,但是在第一次完成 (id) 之后,下一个最终会抛出一个异常:

java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: unique constraint or index violation; SYS_PK_10096 table: PERSON
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown Source)
at com.vaadin.data.util.sqlcontainer.query.TableQuery.executeUpdateReturnKeys(TableQuery.java:588)
at com.vaadin.data.util.sqlcontainer.query.TableQuery.storeRow(TableQuery.java:284)
at com.vaadin.data.util.sqlcontainer.SQLContainer.itemChangeNotification(SQLContainer.java:1069)
at com.vaadin.data.util.sqlcontainer.ColumnProperty.setValue(ColumnProperty.java:207)
at slawek.MyVaadinUI.init(MyVaadinUI.java:93)
at com.vaadin.ui.UI.doInit(UI.java:610)

代码如下:

FormLayout form = new FormLayout();
    TextField idTextField = new TextField("Id");
    TextField nameTextField = new TextField("Name");
    TextField surnameTextField = new TextField("Surname");
    TextField ageTextField = new TextField("Age");
    Button submit = new Button("Add user");
    form.addComponents(idTextField, nameTextField, surnameTextField, ageTextField, submit);

    layout.addComponent(form);
    Item item = container.getItem(container.addItem());
    container.setAutoCommit(true);
    Property propertyId = item.getItemProperty("ID");
    Property propertyName = item.getItemProperty("NAME");
    Property propertySurname = item.getItemProperty("SURNAME");
    Property propertyAge = item.getItemProperty("AGE");

    propertyId.setValue(3);
    propertyName.setValue("someName"); // line number 93
    propertySurname.setValue("someSurname");
    propertyAge.setValue(51);

在数据库中,我只能看到添加了一个仅设置了 ID 号的新行。其余字段为空。 我做错了什么?

【问题讨论】:

【参考方案1】:

您可以通过将下面的行分成两行来检查情况,并在修改之前检查由 container.addItem() 返回的对象的字段。如果对象的 ID 其余字段为 null,则不应使用 proertyId.setValue(3),因为它已经设置。

Item item = container.getItem(container.addItem());

【讨论】:

问题是在我发布我的问题的那天它没有工作,但是第二天我设法启动它并且它开始没有任何问题。也许是一些日食或 hsqldb 问题?无论如何,从那以后它工作正常

以上是关于更改 sqlcontainer 中的属性时出现 java.sql.SQLIntegrityConstraintViolationException - Vaadin的主要内容,如果未能解决你的问题,请参考以下文章

更新实体时出现异常“无法更改关系,因为一个或多个外键属性不可为空”

尝试在 Excel VBA 中设置 RefersToRange 属性时出现问题

更改后面代码中的任何内容时出现 NullPointerException

尝试更改画布中的字体大小和颜色时出现问题

想要将更改保存到数据库时出现异常

(Django) 安装夹具“rules.json”时出现问题:“NoneType”对象没有属性“id”