[英]Hibernate Lazy Initialization exception even using Join Fetch in HQL queries
我想用延迟获取模式初始化一个集合并在我的查询中使用 Join Fetch 但我有时(并非总是)面临延迟初始化异常???
org.hibernate.LazyInitializationException:无法延迟初始化角色集合:xxx.entity.Product.producerEntities,无法初始化代理 - 没有会话...
例如这个查询:
"select p from Product p left join fetch p.producerEntities"
和我的坚持班:
class Product
{
Set<Producer> producerEntities = new HashSet<>();
....
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name="pid")
public Set<Producer> getProducerEntities(){
return producerEntities;
}
....
}
我不明白有什么问题?
如果 join fetch 抛出 LIEX,那么我可以建议使用动态实体图,因为如果您需要定义特定于用例的图。
让我们试试这个,我做到了并为我工作。
public class DynamicEntityGraphDemo {
public static void main(String[] args) {
EntityManager em = HibernateUtil.getEntityManager();
EntityGraph graph = em.createEntityGraph(Product.class);
Subgraph itemGraph = graph.addSubgraph("producerEntities");
Map hints = new HashMap();
hints.put("javax.persistence.loadgraph", graph);
Product pro = em.find(Product.class, 1, hints);
System.out.println("DynamicEntityGraphDemo pro = " + pro.toString() +
"producer = " + pro.getProducerEntities().toString());
}
}
注意:动态实体图在检索子实体时使用 LEFT OUTER JOIN。 (子图 itemGraph = graph.addSubgraph("producerEntities");)
加入获取 p.producerEntities,而不是 p.producer..
问题来自我的集合 setter 和 getter 方法名称。 它解决了。
有很多方法可以解决,使用hibernate属性
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
return dataSource;
}
@Bean
public LocalSessionFactoryBean getSessionFactory() throws IOException {
LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();
factoryBean.setDataSource(dataSource());
Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("hibernate.enable_lazy_load_no_trans", "true");
factoryBean.setHibernateProperties(hibernateProperties);
factoryBean.afterPropertiesSet();
return factoryBean;
}
@Bean
public HibernateTransactionManager getTransactionManager() throws IOException {
HibernateTransactionManager transactionManager = new HibernateTransactionManager();
transactionManager.setSessionFactory(getSessionFactory().getObject());
return transactionManager;
}
或者你可以使用
org.hibernate.annotations.@Proxy
@Entity
@Table(name = "ACTOR")
@Proxy(lazy = false)
public class Actor
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.