数据库表之间存在参考关键,这对应到数据库通常为外键引用。Vaadin 的SQLContainer提供了不同SQLContainer之间引用的有限支持,但其实现主要是通过Java 代码来实现的,并不需要数据库的表之间一定要有外键定义。
给一个SQLContainer添加引用的方法为:
- public void addReference(SQLContainer refdCont,
- String refingCol, String refdCol);
refdCont为被引用的SQLContainer,refingCol 为源SQLContainer对应的列名,refdCol为目标SQLContainer被参照的列名。
要注意的是SQLContainer不支持同一个SQLContainer参照自身。
还是以Customer ,Invoice 为例。 显示所有Invoice,但点击某个Invoice,显示对应的Customer的姓名。
- void openTable(VerticalLayout layout){
- try {
- JDBCConnectionPool pool = new SimpleJDBCConnectionPool(
- "org.hsqldb.jdbc.JDBCDriver",
- "jdbc:hsqldb:file:/hsqldb/data/sample", "SA", "", 2, 5);
- TableQuery customers = new TableQuery("CUSTOMER", pool);
- customers.setVersionColumn("OPTLOCK");
- TableQuery invoices = new TableQuery("INVOICE", pool);
- customers.setVersionColumn("OPTLOCK");
- final SQLContainer customerContainer
- = new SQLContainer(customers);
- final SQLContainer invoiceContainer
- = new SQLContainer(invoices);
- Table table = new Table("All Invoices", invoiceContainer);
- table.setSelectable(true);
- // Send changes in selection immediately to server.
- table.setImmediate(true);
- invoiceContainer.addReference(customerContainer,
- "CUSTOMERID", "ID");
- table.addListener(new ItemClickListener(){
- public void itemClick(ItemClickEvent event) {
- RowItem rowItem=(RowItem)event.getItem();
- RowItem customerItem
- =(RowItem)invoiceContainer
- .getReferencedItem(rowItem.getId(),
- customerContainer);
- customerLabel.setValue(customerItem
- .getItemProperty("FIRSTNAME")
- .toString()
- +" "+ customerItem
- .getItemProperty("LASTNAME")
- .toString());
- }});
- layout.addComponent(table);
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
SQLContainer和参照其它SQLContainer的主要方法如下:
- public boolean setReferencedItem(Object itemId,
- Object refdItemId, SQLContainer refdCont)
- public Object getReferencedItemId(Object itemId,
- SQLContainer refdCont)
- public Item getReferencedItem(Object itemId,
- SQLContainer refdCont)
- public boolean removeReference(SQLContainer refdCont)
这里不再一一说明了。