Я использую spring + hibernate. Все мои HibernateDAO используют непосредственно sessionFactory.Spring, @Transactional и Hibernate Lazy Загрузка
У меня есть прикладной уровень -> сервисный уровень -> слой DAO и все коллекции загружены с лёгкой загрузкой.
Таким образом, проблема в том, что когда-то на прикладном уровне (который содержит GUI/swing) я загружаю объект с использованием метода уровня обслуживания (который содержит аннотацию @Transactional), и я хочу использовать ленивое свойство этого объекта, но obviusly сессия уже закрыта.
Каков наилучший способ решить эту проблему?
EDIT
Я пытаюсь использовать MethodInterceptor, моя идея состоит в том, чтобы написать AroundAdvice для всех моих лиц и использовать аннотацию, так, например:
// Custom annotation, say that session is required for this method
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SessionRequired {
// An AroundAdvice to intercept method calls
public class SessionInterceptor implements MethodInterceptor {
public Object invoke(MethodInvocation mi) throws Throwable {
bool sessionRequired=mi.getMethod().isAnnotationPresent(SessionRequired.class);
// Begin and commit session only if @SessionRequired
if(sessionRequired){
// begin transaction here
}
Object ret=mi.proceed();
if(sessionRequired){
// commit transaction here
}
return ret;
}
}
// An example of entity
@Entity
public class Customer implements Serializable {
@Id
Long id;
@OneToMany
List<Order> orders; // this is a lazy collection
@SessionRequired
public List<Order> getOrders(){
return orders;
}
}
// And finally in application layer...
public void foo(){
// Load customer by id, getCustomer is annotated with @Transactional
// this is a lazy load
Customer customer=customerService.getCustomer(1);
// Get orders, my interceptor open and close the session for me... i hope...
List<Order> orders=customer.getOrders();
// Finally use the orders
}
Как вы думаете, это может работать ? Проблема в том, как зарегистрировать этот перехватчик для всех моих объектов, не делайте этого в XML-файле? Есть способ сделать это с аннотацией?
@DaGGeRRz: это не полезно, в чем разница, чтобы иметь два метода в DAO, например loadLazly и loadEager, и использовать профиль fetch? Нет никакой разницы, я должен написать другой метод, если мне нужно загрузить определенный объект, который ленивый загружен. – blow
Вы можете, например, обернуть службу/dao перехватчиком, который задает профиль профиля «gui» при вызове из gui. Дайте мне знать, если вам нужна дополнительная информация об этом. – DaGGeRRz
@DaGGeRRz: конечно, спасибо, этот звук интересный. – blow