2016-08-26 4 views
1

У меня есть две таблицы Устройства и правила, устройство может иметь n правил, поэтому они существуют в ассоциациях от одного до многих и наоборот.Spring Hibernate не всегда получать дочерние данные

Я использую Spring + Hibernate + REST, я никогда не хочу получать данные правил, когда я получаю данные Devices, когда я использую lazy fetch, я получаю ленивое исключение инициализации. У меня есть отображение гибернации через аннотации. любезно предложите какой-то способ, когда я могу пропустить извлечение данных правил при извлечении данных устройств.

Найти мои классы ниже:

@Entity 
@Table(name="device") 
@DynamicUpdate 
@SelectBeforeUpdate 
public class Devices implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name="DEVICE_ID") 
    private Integer deviceId; 

    @Column(name="DEVICE_DESC") 
    private String deviceDesc; 

    @Column(name="DEVICE_NAME") 
    private String deviceName; 


    @OneToMany(mappedBy="device",fetch = FetchType.LAZY) 
    @JsonIgnore 
    private List<Rules> rules; 



    public Devices() { 
    } 

    public Integer getDeviceId() { 
     return this.deviceId; 
    } 

    public void setDeviceId(Integer deviceId) { 
     this.deviceId = deviceId; 
    } 


    public List<Rules> getRules() { 
     return this.rules; 
    } 

    public void setRules(List<Rules> rules) { 
     this.rules = rules; 
    } 



} 

public class Rules implements Serializable { 
    @Id 
    @Column(name="RULE_ID") 
    private Integer id; 

    public Integer getId() { 
     return this.id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    @ManyToOne 
    @JoinColumn(name="DEV_ID") 
    @JsonIgnore 
    private Devices device; 

    // getter and setter for device follows 
} 

Найти исключение ниже:

SEVERE: Servlet.service() for servlet [mvc-dispatcher] in context with path [/MyWork] threw exception [Request processing failed; nested exception is org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.beans.Devices.rules, no session or session was closed] with root cause 
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.beans.Devices.rules, no session or session was closed 
    at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:393) 
    at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:385) 
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:378) 
    at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:112) 
    at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:266) 
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:95) 
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:99) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:219) 
    at com.google.gson.internal.bind.ObjectTypeAdapter.write(ObjectTypeAdapter.java:107) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96) 
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:99) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:219) 
    at com.google.gson.Gson.toJson(Gson.java:600) 
    at com.google.gson.Gson.toJson(Gson.java:579) 
    at org.springframework.http.converter.json.GsonHttpMessageConverter.writeInternal(GsonHttpMessageConverter.java:199) 
    at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:100) 
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:222) 
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:153) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:165) 
    at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:80) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:126) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:409) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1044) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 
+0

Что исключение вы получаете? – Justas

+0

@Justas найти журнал исключений в вышеуказанном вопросе .... – user1058913

+0

Вы можете unproxy объект перед сериализацией http://stackoverflow.com/questions/11228838/how-to-unproxy-a-hibernate-object Просто исключите Hibernate .initialize (юридическое лицо); строка, чтобы избежать сбора init – StanislavL

ответ

0

Вы читаете Devices в транзакции, на данный момент Rules проксируется. Прочитано here.

При попытке device.getRules() (at com.google.gson.Gson.toJson(Gson.java:579) в вашем трассировки стека) сделка уже завершена и Rule еще не извлекается, и больше не могут быть извлечены.

Вам необходимо убедиться, что вы инициализируете правила до завершения транзакции или заставляете ее загружать.

Также читайте here

+0

Спасибо за ответ, можно сделать device.getRules() не вызванный во время Json Conversion, т. е. избегая части правил устройств в результате Json с помощью каких-либо аннотаций? BTW, я пробовал использовать @JsonIgnore, это мне не помогло. – user1058913

+0

У меня нет опыта работы с библиотекой GSON, но вы можете посмотреть [здесь] (http://stackoverflow.com/questions/4802887/gson-how-to-exclude-specific-fields-from-serialization-without -annotations). Удивительно, что у gson нет похожего на Джексон '@ JsonIgnore', я может быть неправильным. – Rohit

+0

Я сделал это с @Transient аннотацией :) Большое спасибо за вашу помощь ... – user1058913

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