簡體   English   中英

延遲加載問題:Hibernate 3,Spring 4,Jackson 2.4.0

[英]Lazy load Issue : Hibernate 3, Spring 4, Jackson 2.4.0

我的專案正在使用

  • 春季4.0.5。發布
  • 休眠3.6.0。最終版
  • jackson-datatype-hibernate3-2.4.0.jar

問題: / Spring4HibernateMaven / contacts / 3產生LazyInitializationException!

將ObjectMapper(請參閱spring-servlet.xml)更改為com.company.gis.ucvs.ioe.json.HibernateAwareObjectMapper以將Contact POJO轉換為JSON失敗,但發生異常。 但是,如果我只是創建一個虛擬Contact對象,則POJO到JSON的轉換效果很好。 我想念的是什么? 非常感謝您的幫助/指針。

堆棧跟蹤

org.hibernate.LazyInitializationException:無法初始化代理-沒有會話org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)org.hibernate.LazyInitializationException:無法初始化代理.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)com.company.gis.ucvs.ioe.form.Contact _ $$ _ javassist_6.getId(Contact _ $$ _ javassist_6.java)sun.reflect.NativeInternalokee0方法)sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)java.lang.reflect.Method.invoke(Method.java:597)com.fasterxml。 jackson.databind.ser.BeanPropertyWriter.get(BeanPropertyWriter.java:726)com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:506)com.fasterxml.jackson.databind.ser.std.BeanSerializer serializeFields(BeanSeri alizerBase.java:644)com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:114)com.fasterxml。 jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:1837)org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.writeInternal(MappingJackson2HttpMessageConverter.java:253)

來自spring-servlet.xml的片段

<!-- Configure to plugin JSON as request and response in method handler -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="jsonMessageConverter"/>
        </list>
    </property>
</bean>

<!-- Configure bean to convert JSON to POJO and vice versa -->
<bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
**<!--  bean id="jacksonObjectMapper" class="com.fasterxml.jackson.databind.ObjectMapper" /-->
<bean id="jacksonObjectMapper" class="com.company.gis.ucvs.ioe.json.HibernateAwareObjectMapper" />**

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" ref="jacksonObjectMapper" />
<property name="targetMethod" value="configure" />
<property name="arguments">
    <list>
        <value type="com.fasterxml.jackson.databind.DeserializationFeature">FAIL_ON_UNKNOWN_PROPERTIES</value>
        <value>false</value>
    </list>
</property>
</bean>    

來自ContactController.java的SNIPPETS

@RequestMapping(value = "/contacts/{id}", method = RequestMethod.GET,headers="Accept=application/json")
public @ResponseBody Contact getContact(@PathVariable Integer id)  {

    //Contact c = new Contact(); <--- Sample contact POJO to JSON works fine
    //c.setEmail("NO EMAIL");
    Contact c = contactService.getContact(id);
    return c;

}

來自ContactServiceImpl.java的SNIPPETS

@Transactional
public Contact getContact(Integer id) {
    Contact c = contactDAO.getContact(id);
    return c;

}

來自ContactDaoImpl.java的SNIPPET

@Autowired
private SessionFactory sessionFactory;

public Contact getContact(Integer id) {
    Contact contact = (Contact) sessionFactory.getCurrentSession().load(
            Contact.class, id);
    return contact;
}

來自HibernateAwareObjectMapper的SNIPPETS

@SuppressWarnings("serial")
public class HibernateAwareObjectMapper extends ObjectMapper {

    public HibernateAwareObjectMapper() {
        Hibernate3Module hm = new Hibernate3Module();
        registerModule(hm);  
        //Whether lazy-loaded object should be forced to be loaded and then serialized (true); or serialized as nulls (false).Default value is false. 
        hm.configure(Hibernate3Module.Feature.FORCE_LAZY_LOADING, true);
    }

} 

您正在處理獨立實體。 一旦您的對象離開@Transactional方法,它們就會被分離。 將其轉換為DTO(數據傳輸對象)或取消代理,請參見http://java-success.blogspot.de/2012/09/understanding-hibernate-proxy-objects.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM