2015-04-27 3 views
1

У меня есть 2 объекта с родительским отношением детей в спящем режиме (4.2).Hibernate Lazy loading Материнская компания в дочернем объекте (@ManyToOne)

@Entity 
@Table(name = "WORLDZONE") 
public class Worldzone implements java.io.Serializable { 
    @Column 
    private BigDecimal id; 

    @Column 
    private Integer version; 

    @Column 
    private String worldZoneCd; 
    // setters & getters 
} 


@Entity 
@Table(name = "COUNTRY") 
public class Country implements java.io.Serializable { 
    @Column 
    private BigDecimal id; 

    @Column 
    private Integer version; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "WORLDZONE_ID") 
    private Worldzone worldzone; 
    // setters & getters 
} 

В Spring MVC (4.1.3), я использую Джексон ObjectMapper преобразовать мои ответы услуг в формате JSON.

При преобразовании ответа дочернего объекта, Джексон выходит из строя с ошибкой - no session. В принципе, во время преобразования объекта в JSON он не находит сессию Hibernate для ленивой загрузки данных и преобразования ее в JSON.

Мой вопрос заключается в том, какая конфигурация требуется, чтобы позволить Джексону иметь сеанс для ленивой загрузки родительской сущности.

Я попытался ниже вариантов не повезло -

Вариант 1:

Добавлен пользовательский ObjectMapper, используя информацию из этого link

public class HibernateAwareObjectMapper extends ObjectMapper { 
    public HibernateAwareObjectMapper() { 
     Hibernate4Module hm = new Hibernate4Module(); 
     hm.configure(Hibernate4Module.Feature.FORCE_LAZY_LOADING, true); 
     registerModule(hm); 
    } 
} 

После настройки сообщений-конвертер в сервлет-контексте .xml, ошибка остановлена. Но данные идут как null для Parent.

Вариант 2:

Настраивается в web.xml OpenSessionInViewFilter. Но во время преобразования объекта сеанс недоступен Джексону.

Любые указатели были бы полезны. Благодарю.

ответ

-2

Если вы обслуживаете свой объект через контроллер останова или контроллер mvc. Отметьте, что как @Transactional, это оставит сессию открытой в спящем режиме и позволит ленивым загруженным свойствам оцениваться, когда Джексон на них наступает. Я лично отделил бы ваши сущности от ваших DTO и использовал бы что-то вроде Dozer, чтобы сделать сопоставление между 2. Таким образом, вы можете инкапсулировать выборку из репозитория и проецировать на логику DTO в службе, которая может быть транзакционной.

Смежные вопросы