EntityManager имеет нулевое значение (не вводится) с пружиной jboss6 3 в спящем режиме JPA2
пытается перенести существующее приложение, работающее на Jboss4.2.2 Spring 2, в
Jboss 6 Spring 3
После многих попыток приложение правильно развернуто, но при выполнении (отладке) entityManager имеет значение null). Я что-то пропускаю, где и когда вводится EM, так как в старом Application.xml под Spring 2
много изменений
У меня есть файл persistence.xml (новый для Spring 3 jboss 6)
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">`
<persistence-unit name="boxPU" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/BoxMysqlDS</jta-data-source>
<class>box.business.Customer</class>
<properties>
<property name="jboss.entity.manager.factory.jndi.name" value="java:/BoxPersistenceUnitFactory"/>
<property name="jboss.entity.manager.jndi.name" value="java:/boxEM"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
* Apllication.xml для Spring 3 Jboss 6 *
<?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:aop="http://www.springframework.org/schema/aop"`
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
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/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-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/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">
<!-- Container managed data source. -->
<jee:jndi-lookup id="dataSource" jndi-name="java:/BoxMysqlDS"
expose-access-context="false" />
<!-- Spring will inject this container managed persistence unit anywhere
you use @PersistenceContext. -->
<jee:jndi-lookup id="entityManagerFactory" jndi-name="java:/BoxPersistenceUnitFactory"
expected-type="javax.persistence.EntityManagerFactory" />
<context:annotation-config transaction-manager="transactionManager" />
<bean id="customerDaoBean" class="box.dao.CustomerDaoImpl"></bean>
<!-- Manager beans -->
<bean id="boxManagerBean" class="box.service.BoxManagerImpl">
<property name="customerDao" ref="customerDaoBean" />
</bean>
</beans>
Класс обслуживания
package box.service;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import box.dao.CustomerDao;
public class BoxManagerImpl implements BoxManager {
@PersistenceContext(unitName = "boxPU")
private EntityManager entityManager;
private CustomerDao customerDao;
public void setcustomerDao(CustomerDao customerDao) {
this.customerDao = customerDao;
}
public String test() {
boolean retour = customerDao.isEmailAlreadyUsed("fcoget@gmail.com");
return "valeur retour :"+ retour;
}}
Класс DAO
package box.dao;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceException;
import javax.persistence.Query;
import org.springframework.transaction.annotation.Transactional;
import box.business.Customer;
@Transactional
public class CustomerDaoImpl implements CustomerDao {
@PersistenceContext(unitName = "boxPU")
private EntityManager entityManager;
public boolean isEmailAlreadyUsed(String email) {
String SQL_SELECT_CUSTOMER_EXISTS = " select c from " + " "
+ Constants.SQL_CUSTOMER_TABLE + " c, " + " "
+ Constants.SQL_STATUS_TABLE + " s "
+ " where c.status.statusid=s.statusid " + " and c.email='"
+ email.toLowerCase() + "'";
boolean customerexists = false;
if (email == null || email.equals(""))
throw new DaoException("email null in isCustomerExists ", 10);
Customer customer = null;
try {
customer = (Customer) entityManager.createQuery(
SQL_SELECT_CUSTOMER_EXISTS).getSingleResult();
customerexists = (customer == null) ? false : true;
} catch (NoResultException exception) {
customerexists = (customer == null) ? false : true;
}
catch (PersistenceException exception) {
throw new DaoException(exception.getMessage(),
Error.CUSTOMER_IS_EMAIL_ALREADY_EXISTS_DAO_ERROR);
}
if (customerexists)
throw new DaoException(
Error.CUSTOMER_EMAIL_ALREADY_EXISTS_ERROR_MSG,
Error.CUSTOMER_EMAIL_ALREADY_EXISTS_ERROR);
return customerexists;
}
}
Развертывание правильное, ошибок нет. Но при выполнении приложения entityManger в DAO является нулевым.
Это приложение отлично работает с Jboss 4.2.2 и Spring 2.
Я думаю, что проблема заключается в механизме впрыска, я, конечно, что-то пропустить.
спасибо