Проблема исключения инициализации Hibernate Lazy с Gilead в интеграции GWT 2.0 - PullRequest
0 голосов
/ 17 мая 2010

Я использую GWT 2.0 в качестве слоя пользовательского интерфейса в моем проекте. На стороне сервера я использую 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 я использую UserDAO , который расширяет HibernateDAOSupport от Spring. UserDAO имеет метод getAll для возврата всех пользователей.

И в моей службе DAO я использую UserService , который использует userDAO для получения всех пользователей.

Итак, когда я получаю всех пользователей из UsersService, возвращаемые сущности Users отсоединяются от сеанса Hibernate. По этой причине я не хочу использовать метод getRoles () в экземпляре Users, который я получаю из своего сервиса.

Что я хочу, так это просто передать свой список пользователей благодаря службе RPC, чтобы иметь возможность использовать чужую информацию о пользователях на стороне клиента с GWT.

Таким образом, моя основная проблема заключается в том, чтобы иметь возможность конвертировать PersistentBag в Users.roles в простой список, чтобы иметь возможность передавать через RPC пользователей. Для этого я видел, что Gilead Framework может быть решением.

Чтобы использовать Gilead, я изменил свои доменные объекты. Теперь они расширяют net.sf.gilead.pojo.gwt.LightEntity и уважают спецификацию JavaBean.

На сервере я предоставляю свои сервисы через RPC благодаря инфраструктуре GwtRpcSpring (http://code.google.com/p/gwtrpc-spring/).. В этой платформе есть совет, упрощающий интеграцию с Gilead.

My 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, которая получает всех пользователей, я получаю исключение отложенной инициализации из Hibernate из Users.roles.

Я разочарован, потому что думал, что Gilead позволит мне сериализовать мои доменные сущности, даже если эти сущности содержат PersistentBag.

Это не одна из целей Галаад?

Итак, кто-нибудь знает, как настроить Gilead (с GwtRpcSpring или другим решением), чтобы он мог передавать доменные объекты без исключения Lazy?

Заранее спасибо за помощь.

Сильвен

1 Ответ

1 голос
/ 10 ноября 2010

Ну, ответ прост: Object retVal = pjp.proceed (); возвращает обычный объект Hibernate, а не обработанный Gilead объект. Может быть, кто-то знает, как на самом деле добавить надлежащие советы Gilead в отношении услуг?

...