【发布时间】:2014-06-20 12:31:52
【问题描述】:
我已经尝试了我所面临的这个问题的大部分解决方案,但我仍然不清楚。
我正在使用 Hibernate 4。
我的实体中有父子关系。默认情况下,我对父实体中的所有集合使用延迟加载。但是,在某些情况下,我需要加载整个对象图。在这种情况下,我想强制休眠加载所有集合。我知道通过使用criteria.setFetchMode("collectionName",FetchMode.JOIN),我可以加载特定的集合。但是,如果我尝试为多个集合执行此操作,我会得到org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags。
这是我的代码:
实体
忽略一些字段和getter和setter方法
public class Employee {
@Id
@GeneratedValue
@Column(name = "EmployeeId")
private long id;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@Fetch(FetchMode.SELECT)
@JoinColumn(name = "EmployeeId")
@LazyCollection(LazyCollectionOption.TRUE)
private List<EmployeeAddress> employeeAddresses;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@Fetch(FetchMode.SELECT)
@JoinColumn(name = "EmployeeId")
@LazyCollection(LazyCollectionOption.TRUE)
private List<EmployeeLanguage> employeeLanguages;
}
HibernateUtil
public HibernateUtil{
public TEntity findById(Class<TEntity> clazz, long id) {
Session session = sessionFactory.getCurrentSession();
Criteria criteria = session.createCriteria(clazz);
criteria.add(Restrictions.eq("id",id));
ClassMetadata metadata = sessionFactory.getClassMetadata(clazz);
String[] propertyNamesArray = metadata.getPropertyNames();
for(int i=0;i<propertyNamesArray.length;i++){
criteria.setFetchMode(propertyNamesArray[i], FetchMode.JOIN);
}
return (TEntity)criteria.uniqueResult();
}
}
服务
private void getAllEmployee(Employee employee) {
//invoke the findAll method of hibernateutil
}
我想在 findAll() 方法中预先加载 Employee 的所有集合。 请告诉我如何完成。
在 HIbernateUtil 中使用 FetchType.SELECT 时添加堆栈跟踪
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.myapp.hr.entity.Employee.employeeAddresses, could not initialize proxy - no Session
org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:566)
org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:186)
org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:545)
org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:124)
org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:266)
java.util.Collections$UnmodifiableCollection$1.<init>(Collections.java:1099)
java.util.Collections$UnmodifiableCollection.iterator(Collections.java:1098)
com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:90)
com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:23)
com.fasterxml.jackson.databind.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:186)
com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:569)
com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:597)
com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:142)
com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:118)
com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:1819)
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.writeInternal(MappingJackson2HttpMessageConverter.java:253)
org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:207)
org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:148)
org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:125)
org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:71)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:122)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.apache.catalina.filters.CorsFilter.handleNonCORS(CorsFilter.java:439)
org.apache.catalina.filters.CorsFilter.doFilter(CorsFilter.java:178)
【问题讨论】:
-
你不能简单地将获取模式更改为渴望,而不是懒惰吗?
-
没有。除了这种情况,我需要它变得懒惰。