0

我在我的项目中使用 GWT 2.0 作为 UI 层。在服务器端,我使用 Hibernate。例如,这是我拥有的 2 个域实体:

public class User {
      private Collection<Role> roles;
      @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "users", targetEntity = Role.class)
    public Collection<Role> getRoles() {
        return roles;
    }
      ...
}

public class Role {
      private Collection<User> users;
      @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = User.class)
    public Collection<User> getUsers() {
        return users;
    }    
      ...
}

在我的 DAO 层上,我使用从 Spring扩展HibernateDAOSupport的UserDAO 。UserDAO 有getAll方法来返回所有用户。

在我的 DAO 服务上,我使用UserService,它使用 userDAO 来获取所有用户。

因此,当我从 UsersService 获取所有用户时,返回的用户实体与 Hibernate 会话分离。出于这个原因,我不想在从我的服务获得的用户实例上使用getRoles()方法。

我想要的只是通过 RPC 服务传输我的用户列表,以便能够通过 GWT 在客户端使用用户的其他信息。

因此,我的主要问题是能够将简单列表中 Users.roles 中的 PersistentBag 转换为能够通过 RPC 传输用户。为此,我已经看到 Gilead Framework 可能是一个解决方案。

为了使用 Gilead,我更改了我的域实体。现在,他们扩展了 net.sf.gilead.pojo.gwt.LightEntity并且他们尊重 JavaBean 规范。

在服务器上,由于 GwtRpcSpring 框架 ( http://code.google.com/p/gwtrpc-spring/ ),我通过 RPC 公开了我的服务。这个框架有一个建议,可以让 Gilead 更容易集成。

我的 applicationContext 包含 Gilead 的以下配置:

<bean id="gileadAdapterAdvisor" class="org.gwtrpcspring.gilead.GileadAdapterAdvice" />
<aop:config>
    <aop:aspect id="gileadAdapterAspect" ref="gileadAdapterAdvisor">
        <aop:pointcut id="gileadPointcut"
            expression="execution(public * com.google.gwt.user.client.rpc.RemoteService.*(..))" />
        <aop:around method="doBasicProfiling" pointcut-ref="gileadPointcut" />
    </aop:aspect>
</aop:config>

<bean id="proxySerializer" class="net.sf.gilead.core.serialization.GwtProxySerialization" />

<bean id="proxyStore" class="net.sf.gilead.core.store.stateless.StatelessProxyStore">
    <property name="proxySerializer" ref="proxySerializer" />
</bean>

<bean id="persistenceUtil" class="net.sf.gilead.core.hibernate.HibernateUtil">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean class="net.sf.gilead.core.PersistentBeanManager">
    <property name="proxyStore" ref="proxyStore" />
    <property name="persistenceUtil" ref="persistenceUtil" />
</bean>

doBasicProfiling 方法的代码如下:

@Around("within(com.google.gwt.user.client.rpc.RemoteService..*)")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
    if (log.isDebugEnabled()) {
        String className = pjp.getSignature().getDeclaringTypeName();
        String methodName = className
                .substring(className.lastIndexOf(".") + 1)
                + "." + pjp.getSignature().getName();
        log.debug("Wrapping call to " + methodName
                + " for PersistentBeanManager");
    }
    GileadHelper.parseInputParameters(pjp.getArgs(), beanManager,
            RemoteServiceUtil.getThreadLocalSession());
    Object retVal = pjp.proceed();
    retVal = GileadHelper.parseReturnValue(retVal, beanManager);

    return retVal;
}

使用该配置,当我运行我的应用程序并使用获取所有用户的 RPC 服务时,我从 Users.roles 中获得了来自 Hibernate 的延迟初始化异常。

我很失望,因为我认为 Gilead 会让我序列化我的域实体,即使这些实体包含 PersistentBag。

这不是吉利德的目标之一?

那么,有人会知道如何配置 Gilead(使用 GwtRpcSpring 或其他解决方案)以能够在没有延迟异常的情况下传输域实体?

提前感谢您的帮助。

西尔万

4

1 回答 1

1

答案很简单 Object retVal = pjp.proceed(); 返回普通的 Hibernate 对象,而不是 Gilead 处理的对象。也许有人知道如何围绕服务实际添加适当的吉利德建议?

于 2010-11-10T09:50:48.850 回答