[英]LazyInitializationException with active transaction and connection open
I know this has been asked many times (already cheched most of the post here and in other sites), but I dont get to solve my problem. 我知道这个问题已经被问过很多次了(已经在这里和其他网站上找到了大部分帖子),但是我无法解决我的问题。
My setup is: jpa 2 + hibernate 4 + spring 4 + primefaces + jboss eap 7 我的设置是:jpa 2 +休眠4 +春季4 + primefaces + jboss eap 7
The problem: I got a lazy collection into another bean, but when I get to call the .size() method on the bean, it throws the "LazyInitializationException: failed to lazily initialize a collection of role: com.pe.controlLines.data.model.Activity.activityRisks, could not initialize proxy - no Session" 问题:我将懒惰的集合放入另一个Bean,但是当我在该Bean上调用.size()方法时,它将引发“ LazyInitializationException:无法延迟初始化角色的集合:com.pe.controlLines.data .model.Activity.activityRisks,无法初始化代理-没有会话”
Im sure i got an active transaction following this LazyInitializationException Within a @Transactional Method and http://blog.timmattison.com/archives/2012/04/19/tips-for-debugging-springs-transactional-annotation/ so I'm 100% sure theres a transaction running at the time. 我确定我在@Transactional方法和http://blog.timmattison.com/archives/2012/04/19/tips-for-debugging-springs-transactional-annotation/ 内的这个LazyInitializationException之后得到了一笔活跃交易100%确保当时有交易在运行。
My entity clases: 我的实体有:
@Entity
public class Company {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long companyId;
@Column
private String name;
@OneToOne(cascade={CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE})
private Activity companieActivities;
@OneToMany
private Collection<SourceSupervision> sourceSupervisions;
and the nested class 和嵌套类
@Entity
@Indexed
public class Activity {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long activityId;
@ManyToOne
@JoinColumn(name="parentActivityId")
private Activity parent;
@Column
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO)
@Analyzer(definition = "searchtokenanalyzer")
private String name;
@Column
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO)
@Analyzer(definition = "searchtokenanalyzer")
private String description;
@OneToMany(cascade={CascadeType.PERSIST, CascadeType.REFRESH})
private Collection<ActivityRisk> activityRisks = new ArrayList<ActivityRisk>();
@ManyToMany(cascade={CascadeType.PERSIST, CascadeType.REFRESH})
private Collection<Word> words;
@ManyToMany
private Collection<Rol> rolesForActivity;
the bussines delegate is anotated like this (the bussines is called from the page controller): bussines委托是这样注释的(从页面控制器调用bussines):
@Component
@Scope("session")
@Transactional
public class SystemConfigurationBussinesDelegate {
Got an inicialization of the reference to the entity, which executes fine. 对该实体的引用进行了初始化,可以很好地执行。 (this is from the aboce class) (这是来自高级班)
private Company currentCompany;
private Risk currentRisk;
@PostConstruct
public void init(){
//((WordDAO)wordDAO).startIndexer();
currentCompany = genericDAO.get(Company.class, 1l);
}
But in this method 但是用这种方法
public List<Danger> getDangers(){
List<Danger> returnValue = new ArrayList<Danger>();
System.out.println(TransactionSynchronizationManager.isActualTransactionActive());
Hibernate.initialize(currentCompany.getCompanieActivities());
currentCompany.getCompanieActivities().getActivityRisks().size();
for( ActivityRisk aRisk : currentCompany.getCompanieActivities().getActivityRisks() ){
Risk risk = aRisk.getRisk();
if(risk == currentRisk){
returnValue = new ArrayList<Danger>(aRisk.getDangers());
}
}
return returnValue;
}
the sysout returns true so the transaction is active, and I can see an open connection to the database, the Hibernate.inicialize works fine, and the call to currentCompany.getCompanieActivities().getActivityRisks().size(); sysout返回true,因此事务处于活动状态,并且可以看到与数据库的打开连接,Hibernate.inicialize正常运行,并且对currentCompany.getCompanieActivities()。getActivityRisks()。size()的调用; throws the exception. 引发异常。
Could it be some problem with contexts or somethng similar? 上下文或类似的东西可能有问题吗?
My spring configuration: 我的弹簧配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:util="http://www.springframework.org/schema/util"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-2.5.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee.xsd">
<context:component-scan base-package="com.pe.controlLines" />
<context:annotation-config />
<context:spring-configured />
<aop:aspectj-autoproxy proxy-target-class="true"/>
<jee:jndi-lookup id="myDataSource" jndi-name="java:/ControllinesDS"/>
<!-- Data Source Declaration -->
<!-- Session Factory Declaration <bean id="SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> -->
<!-- Session Factory Declaration -->
<bean id="SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource" />
<!-- <property name="packagesToScan">
<list>
<value>net.javabeat.spring.model</value>
</list>
</property>
<property name="annotatedClasses">
<list>
<value>co.com.testTalos.model.Storage</value>
<value>co.com.testTalos.model.Buyer</value>
<value>co.com.testTalos.model.Preferences</value>
</list>
</property>-->
<property name="packagesToScan">
<list>
<value>com.pe.controlLines.data.model</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.search.default.directory_provider">filesystem</prop>
<prop key="hibernate.search.default.indexBase">C:/DEVELOPMENT/lucene/indexes</prop>
</props>
</property>
</bean>
<!-- Enable the configuration of transactional behavior based on annotations -->
<tx:annotation-driven transaction-manager="txManager"/>
<!-- Transaction Manager is defined -->
<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="SessionFactory"/>
</bean>
</beans>
I think your problem is to do with calling the transactional method inside @PostConstruct
. 我认为您的问题与调用@PostConstruct
的事务方法有关。 By design spring tx aspects are/may not active on postconstruct method because not all beans guaranteed to have finished constructing. 根据设计,春季tx方面/可能不会在后构造方法上起作用,因为并非所有的bean都保证已完成构造。 Try searching this topic, I remember encountering this by surprise too but there are plenty helpful articles. 尝试搜索此主题,我记得也曾偶然遇到此主题,但是有很多有用的文章。
Since then my prefered alternatives when I need tx on postconstruct is to
use programmatic transaction (see Spring TransactionTemplate patterns)
use the ContextRefreshedEvent. 从那时起,当我需要在postconstruct上发送tx时,我首选的替代方法是
使用程序化事务(请参见Spring TransactionTemplate模式),并
使用ContextRefreshedEvent。 See below example: 请参见以下示例:
@Service
public class MyService implements ApplicationListener<ContextRefreshedEvent> {
public void onApplicationEvent(ContextRefreshedEvent event) {
// This method will be executed at context startup or refresh
// It is guaranteed all beans have finish constructing, hence
// AOP tx is available
}
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.