Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate结果变压器和gwt请求工厂_Hibernate_Gwt_Requestfactory - Fatal编程技术网

Hibernate结果变压器和gwt请求工厂

Hibernate结果变压器和gwt请求工厂,hibernate,gwt,requestfactory,Hibernate,Gwt,Requestfactory,我创建了自定义结果转换器,它扩展了BasicTransformerAdapter。在transformTuple方法中,我创建了实体的新对象: @Override public Object transformTuple(Object[] tuple, String[] aliases) { RegistryRow row = new RegistryRow(); DataRow dataRow = new DataRow(); Registry registry =

我创建了自定义结果转换器,它扩展了BasicTransformerAdapter。在transformTuple方法中,我创建了实体的新对象:

@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;
  }
它在调用列表服务的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 = ?;
这些查询的执行次数与列表中的行数相同。我不知道如何摆脱这些对性能有影响的额外查询。您知道为什么会有额外的数据库查询吗? (我在实体中添加了如下变量:

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

  Long getId();

  DataRowProxy getGridRow();

  Date getCreateDate();

  RegistryProxy getRegistry();

  Long getDataId();
}
@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;

它仍然在对每一行进行查询。

您告诉RequestFactory获取一个
RegistryRowProxy
,并检索其
gridRow
子属性(通过使用
和(“gridRow”)

因此,在后端,
RequestFactory
将在内部调用
getGridRow
getter,这将导致Hibernate(延迟)加载
gridRow
关系。
为了避免子查询,您需要告诉Hibernate立即加载关系。
JPA应该在默认情况下为
@OneToOne
@ManyToOne
关系执行此操作

我假设您的问题是您的
DataRow dataGrid
属性上缺少
@OneToOne
注释:

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

您告诉RequestFactory获取一个
RegistryRowProxy
,并检索其
gridRow
子属性(通过使用
和(“gridRow”)

因此,在后端,
RequestFactory
将在内部调用
getGridRow
getter,这将导致Hibernate(延迟)加载
gridRow
关系。
为了避免子查询,您需要告诉Hibernate立即加载关系。
JPA应该在默认情况下为
@OneToOne
@ManyToOne
关系执行此操作

我假设您的问题是您的
DataRow dataGrid
属性上缺少
@OneToOne
注释:

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

在代码中是这样的:
@OneToOne(fetch=FetchType.EAGER,cascade=CascadeType.ALL)@JoinColumn(name=“T\u DATA\u ROWS\u ID”)@NotNull private DataRow gridRow在代码中它看起来是这样的:
@OneToOne(fetch=FetchType.EAGER,cascade=CascadeType.ALL)@JoinColumn(name=“T\u DATA\u ROWS\u ID”)@NotNull private DataRow gridRow