I'm a newbie that's been fooling around with Smart-Gwt for a couple of days. I've got 2 datasources up and running which are read from Hibernate/Gilead through GenericGwtRpcDatasource (thanks everyone involved for this!).
Hibernate/Gilead DTO used as DataSources record
ProductDS
ConfiguratorSettingDS:
Both data sources are identified by their id field. However it seams thats their names fields are actually the one being chosen:
I' am able to display a ListGrid with http://www.smartclient.com/smartgwt/showcase/#featured_nested_grid as a foundation:
When I extend a node in the ListGrid I guess that it should send an request to fetch a ConfigurationSetttingDS record identified by the value in configuratorSettingId for the extended row.
However what happens is that the value of ProductDS 'name'-field instead gets passed as the filter (verified at the server that the 'name' not the 'configuratorSettingId' -attribute of ProductDS gets passed as filter and reaches as far as to Hibernate DTO).
I am quite convinced that I must have made some errors in my Data Sources but I can't see where.
Any help would bee deeply appreciated.
/Lukas
Version: SmartGwt 2.2 (LGpl))
Hibernate/Gilead DTO used as DataSources record
Code:
@Entity @Table(name="product") public class Product extends LightEntity implements Serializable{ @Id @Column(name="product_nr", unique=true, nullable=false, length=20) private String productNr; @Column(name="status", unique=false, nullable=false, columnDefinition="bit") private int status; @Column(name="product_family_id", unique=false, nullable=false, length=13) private String productFamilyId; @Column(name="name", unique=false, nullable=true, length=32) private String name; @Column(name="short_description", unique=false, nullable=true, length=128) private String shortDescription; @Column(name="long_description", unique=false, nullable=true, columnDefinition="TEXT") private String longDescription; @Column(name="configurator_instruction", unique=false, nullable=true, columnDefinition="TEXT") private String configuratorInstruction; @Column(name="free_accessories_comment", unique=false, nullable=true, columnDefinition="TEXT") private String freeAccessoriesComment; @OneToOne(cascade = CascadeType.ALL) private ConfiguratorSetting configuratorSetting; public ConfiguratorSetting getConfiguratorSetting() { return configuratorSetting; } public void setConfiguratorSetting(ConfiguratorSetting configuratorSetting) { this.configuratorSetting = configuratorSetting; } public String getProductNr() { return productNr; } public void setProductNr(String productNr) { this.productNr = productNr; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public String getProductFamilyId() { return productFamilyId; } public void setProductFamilyId(String productFamilyId) { this.productFamilyId = productFamilyId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getShortDescription() { return shortDescription; } public void setShortDescription(String shortDescription) { this.shortDescription = shortDescription; } public String getLongDescription() { return longDescription; } public void setLongDescription(String longDescription) { this.longDescription = longDescription; } public String getConfiguratorInstruction() { return configuratorInstruction; } public void setConfiguratorInstruction(String configuratorInstruction) { this.configuratorInstruction = configuratorInstruction; } public String getFreeAccessoriesComment() { return freeAccessoriesComment; } public void setFreeAccessoriesComment(String freeAccessoriesComment) { this.freeAccessoriesComment = freeAccessoriesComment; } public boolean equals(final Object other){ if(other.getClass() == Product.class){ Product otherProduct = (Product) other; if(getProductNr() == otherProduct.getProductNr()){ return true; } } return false; } } @Entity @Table(name="configurator_setting") public class ConfiguratorSetting extends LightEntity implements Serializable{ @Id @Column(name="id", unique=true, nullable=false) private int id; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Column(name="name", unique=false, nullable=false) private String name; //private ArrayList<PrintSurfaceGroup> possibleSurfaceGroups; }
Code:
public class ProductDS extends GenericGwtRpcDataSource<Product, ListGridRecord, ProductDSServiceAsync>{ private static ProductDS instance; public static ProductDS getInstance() { if (instance == null) { instance = new ProductDS(); instance.setID("product"); } return (instance); } private ListGridRecord getEditedRecord (DSRequest request) { // Retrieving values before edit JavaScriptObject oldValues = request.getAttributeAsJavaScriptObject ("oldValues"); // Creating new record for combining old values with changes ListGridRecord newRecord = new ListGridRecord (); // Copying properties from old record JSOHelper.apply (oldValues, newRecord.getJsObj ()); // Retrieving changed values JavaScriptObject data = request.getData (); // Apply changes JSOHelper.apply (data, newRecord.getJsObj ()); return newRecord; } @Override public List<DataSourceField> getDataSourceFields() { setID("product"); List<DataSourceField> fields = new ArrayList<DataSourceField>(); DataSourceField field; field = new DataSourceTextField("productNr", "PRODUCTNR"); field.setPrimaryKey (true); // AutoIncrement on server. field.setRequired (false); fields.add(field); field = new DataSourceTextField ("productFamilyId", "ProductFamiljId"); field.setRequired (true); fields.add(field); DataSourceIntegerField field2 = new DataSourceIntegerField("configuratorSettingId", "configuratorSettingId"); field2.setForeignKey("configuratorSetting.id"); fields.add(field2); field = new DataSourceTextField ("name", "NAME"); field.setRequired (true); fields.add(field); return fields; } @Override public void copyValues(ListGridRecord from, Product to) { to.setProductNr(from.getAttributeAsString("productNr")); to.setName(from.getAttributeAsString("name")); to.setStatus(from.getAttributeAsInt("status")); to.setProductFamilyId(from.getAttribute("productFamilyId")); } @Override public void copyValues(Product from, ListGridRecord to) { to.setAttribute("productNr", from.getProductNr()); to.setAttribute("name", from.getName()); to.setAttribute("status", from.getStatus()); to.setAttribute("productFamilyId", from.getProductFamilyId()); if(from.getConfiguratorSetting() != null){ to.setAttribute("configuratorSettingId", from.getConfiguratorSetting().getId()); } } @Override public ProductDSServiceAsync getServiceAsync() { return GWT.create(ProductDSService.class); } @Override public ListGridRecord getNewRecordInstance() { return new ListGridRecord(); } @Override public Product getNewDataObjectInstance() { return new Product(); } }
Code:
public class ConfiguratorSettingDS extends GenericGwtRpcDataSource<ConfiguratorSetting, ListGridRecord, ConfiguratorSettingDSServiceAsync>{ private static ConfiguratorSettingDS instance; public static ConfiguratorSettingDS getInstance() { if (instance == null) { instance = new ConfiguratorSettingDS(); instance.setID("configuratorSetting"); } return (instance); } @Override public List<DataSourceField> getDataSourceFields() { setID("configuratorSetting"); List<DataSourceField> fields = new ArrayList<DataSourceField>(); DataSourceIntegerField field; field = new DataSourceIntegerField("id", "ID"); field.setPrimaryKey(true); // AutoIncrement on server. field.setRequired (false); fields.add(field); DataSourceTextField field2 = new DataSourceTextField ("name", "Namn"); field2.setRequired (true); fields.add(field2); return fields; } @Override public void copyValues(ListGridRecord from, ConfiguratorSetting to) { to.setId(from.getAttributeAsInt("id")); to.setName(from.getAttributeAsString("name")); } @Override public void copyValues(ConfiguratorSetting from, ListGridRecord to) { to.setAttribute("id", from.getId()); to.setAttribute("name", from.getName()); } @Override public ConfiguratorSettingDSServiceAsync getServiceAsync() { return GWT.create(ConfiguratorSettingDSService.class); } @Override public ListGridRecord getNewRecordInstance() { return new ListGridRecord(); } @Override public ConfiguratorSetting getNewDataObjectInstance() { return new ConfiguratorSetting(); } }
Code:
23:40:55.620:MUP5:WARN:DataSource:configuratorSetting:matched tree relationship field by name: name
Code:
public void onModuleLoad() { ListGrid listGrid = new ListGrid() { public DataSource getRelatedDataSource(ListGridRecord record) { return ConfiguratorSettingDS.getInstance(); } @Override protected Canvas getExpansionComponent(final ListGridRecord record) { final ListGrid grid = this; VLayout layout = new VLayout(5); layout.setPadding(5); final ListGrid countryGrid = new ListGrid(); countryGrid.setWidth(500); countryGrid.setHeight(224); countryGrid.setCellHeight(22); countryGrid.setDataSource(getRelatedDataSource(record)); countryGrid.fetchRelatedData(record, ProductDS.getInstance()); countryGrid.setCanEdit(true); countryGrid.setModalEditing(true); //countryGrid.setEditEvent(ListGridEditEvent.CLICK); //countryGrid.setListEndEditAction(RowEndEditAction.NEXT); countryGrid.setAutoSaveEdits(false); layout.addMember(countryGrid); HLayout hLayout = new HLayout(10); hLayout.setAlign(Alignment.CENTER); IButton saveButton = new IButton("Save"); saveButton.setTop(250); layout.addMember(hLayout); return layout; } }; listGrid.setDataSource(ProductDS.getInstance()); listGrid.setAutoFetchData(true); listGrid.setWidth(500); listGrid.setHeight(400); listGrid.setCanExpandRecords(true); listGrid.setAutoFetchData(true); listGrid.draw(); } }
When I extend a node in the ListGrid I guess that it should send an request to fetch a ConfigurationSetttingDS record identified by the value in configuratorSettingId for the extended row.
However what happens is that the value of ProductDS 'name'-field instead gets passed as the filter (verified at the server that the 'name' not the 'configuratorSettingId' -attribute of ProductDS gets passed as filter and reaches as far as to Hibernate DTO).
I am quite convinced that I must have made some errors in my Data Sources but I can't see where.
Any help would bee deeply appreciated.
/Lukas
Version: SmartGwt 2.2 (LGpl))
Comment