Проблема с настройкой JPA-сущности от Jboss 4.2.2 Spring 2 до Jboss 6 Spring 3 - PullRequest
2 голосов
/ 19 мая 2011

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. Я думаю, что проблема заключается в механизме впрыска, я, конечно, что-то пропустить. спасибо

...