2016-05-05 63 views
1

我創建了擴展BasicTransformerAdapter的自定義結果轉換器。在transformTuple方法中,我創建實體的新對象:Hibernate ResultTransformer和gwt requestfactory

@Override 
    public Object transformTuple(Object[] tuple, String[] aliases) { 
    RegistryRow row = new RegistryRow(); 
    DataRow dataRow = new DataRow(); 
    Registry registry = new Registry(); 

    for (int i = 0; i < aliases.length; i++) { 
     if ("id".equals(aliases[i])) { 
     row.setId((Long) tuple[i]); 
     } else if ("entityVersion".equals(aliases[i])) { 
     row.setEntityVersion((Long) tuple[i]); 
     } else if ("gridRowId".equals(aliases[i])) { 
     dataRow.setId((Long) tuple[i]); 
     } else if ("rowEntityVersion".equals(aliases[i])) { 
     dataRow.setEntityVersion((Long) tuple[i]); 
     } else if (tuple[i] != null && aliases[i] != null && aliases[i].startsWith("set")) { 
     try { 
      DataType type = DataRow.getDataType(tuple[i].getClass()); 
      Method m = DataRow.class.getMethod(aliases[i], type.getDataClass()); 
      m.invoke(dataRow, DataRow.castValue(tuple[i], type)); 
     } catch (Exception e) { 
      LOG.error("--Error while setting dataRow data: ", e); 
     } 
     } else if ("registryCode".equals(aliases[i])) { 
     registry.setCode((String) tuple[i]); 
     } else if ("registryEntityVersion".equals(aliases[i])) { 
     registry.setEntityVersion((Long) tuple[i]); 
     } 
    } 

    row.setRegistry(registry); 
    row.setGridRow(dataRow); 

    return row; 
    } 

一切工作正常。有創建RegistryRow對象的列表。 在客戶端有RegistryRowProxy看起來像這樣:

@ProxyFor(value = RegistryRow.class, locator = LongEntityLocator.class) 
public interface RegistryRowProxy extends EntityProxy, BeanModelTag { 

    Long getId(); 

    DataRowProxy getGridRow(); 

    Date getCreateDate(); 

    RegistryProxy getRegistry(); 

    Long getDataId(); 
} 

它是GWT RequestFactory其中話費清單服務使用。

getRequestFactory().registryRow().list(registry.getCode(), paramsId).with("gridRow").fire(receiver); 

它返回的數據,一切都很好,但是當我打開show_sql它正在做額外的選擇數據庫。類似的查詢:

select "all_columns" from RegistryRow where id = ?; 
select "all_columns" from DataRow where id = ?; 

這些查詢的執行次數與列表中的行數一樣多。我不知道如何擺脫這些對性能有影響的附加查詢。你知道爲什麼有額外的數據庫查詢? (我補充一點,在實體存在變數,看起來像這樣:

@JoinColumn(name = "T_DATA_ROWS_ID") 
    @NotNull 
    private DataRow gridRow; 

,但並非全部)

更新1: 註釋是這樣的正是:

@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
@JoinColumn(name = "T_DATA_ROWS_ID") 
@NotNull 
private DataRow gridRow; 

而且仍然在爲每一行進行查詢。

回答

0

您正在告訴RequestFactory獲取RegistryRowProxy並且還會檢索gridRow子屬性(使用with("gridRow"))。
因此,您的後端RequestFactory將在內部調用您的getGridRow獲取器,這將導致Hibernate(懶惰)加載gridRow關係。
爲了避免子查詢,你需要告訴Hibernate熱切地加載關係。
JPA應該默認爲@OneToOne@ManyToOne關係執行此操作。

我想你的問題是,你缺少的@OneToOne註釋您DataRow dataGrid屬性:

@JoinColumn(name = "T_DATA_ROWS_ID",nullable=false) 
@NotNull 
@OneToOne 
private DataRow gridRow; 
+0

在代碼中,它看起來是這樣的: '@OneToOne(取= FetchType.EAGER,級聯= CascadeType.ALL ) @JoinColumn(name =「T_DATA_ROWS_ID」) @NotNull private DataRow gridRow;' – Caroline