Important Notice - Forums is archived
To simplify things and help our users to be more productive, we have archived the current forum and focus our efforts on helping developers on Stack Overflow. You can post new questions on Stack Overflow or join our Discord channel.

Vaadin lets you build secure, UX-first PWAs entirely in Java.
Free ebook & tutorial.
SQLContainer with MSSQL addItem/getItem mismatch bug
I am new to Vaadin, but pretty sure this is a bug. The ID returned by SQLContainer.addItem() cannot be used for a subsequent getItem() call. Maybe this only bites with an "identity" type primary key, but using an identity key is a common pattern, and SQLContainer seems to explicitly try to support it, in general. I believe the problem is related to what is returned by addItem(): the RowId returned does not contain the same value type as what is returned by getItemIds().
Table:
CREATE TABLE bugDemo(
[id] [int] IDENTITY(1,1) NOT NULL,
[version] [int] NOT NULL default (1),
[someOtherproperty] varchar(20) null,
CONSTRAINT [PK_bugDemo] PRIMARY KEY CLUSTERED
(
[id] ASC
) ON [PRIMARY]
) ON [PRIMARY]
Code to illustrate the problem:
private void showProblem(Layout layout) throws SQLException {
final TableQuery demoTable;
JDBCConnectionPool pool = new SimpleJDBCConnectionPool(
"com.microsoft.sqlserver.jdbc.SQLServerDriver",
"jdbc:sqlserver://localhost:1433;databaseName=vaadinExercise;",
"foo",
"bar"
);
MSSQLGenerator gen = new MSSQLGenerator();
demoTable = new TableQuery("bugDemo", pool, gen);
demoTable.setVersionColumn("version");
SQLContainer container = new SQLContainer(demoTable);
container.setAutoCommit(true);
Object newKey = container.addItem();
Object newKeyValue = ((com.vaadin.data.util.sqlcontainer.RowId)newKey).getId();
layout.addComponent(new Label("added new item, ID=" + newKey + "," + newKeyValue[0].getClass() ));
Collection<?> itemIds = container.getItemIds();
Object oneKey = itemIds.toArray()[0];
Object oneKeyValue = ((com.vaadin.data.util.sqlcontainer.RowId)oneKey).getId();
layout.addComponent(new Label("but the class of item IDs in the table is " + oneKeyValue.getClass()));
Item addedItem = container.getItem(newKey);
if (null == addedItem) {
layout.addComponent(new Label("Therefore, you cannot retrieve the item you just added!"));
} else
{
layout.addComponent(new Label("But you can retrieve the item by the key, anyway"));
}
}
}
Output:
added new item, ID=4,class java.math.BigDecimal
but the class of item IDs in the table is class [Ljava.lang.Object;
Therefore, you cannot retrieve the item you just added!
I ran into this using Vaadin version 7.4.5, and reproduced it again in version 7.5.0. Using sqljdbc41.jar from Microsoft.
Any advice?