Я использую 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?
Заранее спасибо за помощь.
Сильвен