Не удалось открыть JPA EntityManager для транзакции в Spring Test - PullRequest
0 голосов
/ 12 октября 2011

У меня есть проект Java, использующий Spring 3.0, JPA 2.0 с IDE MyEclipse

Попытка преобразовать некоторые базовые дао-интеграционные тесты в Spring и столкнуться с несколькими проблемами. Вот мои настройки:

LevelDAO

public class LevelDAO extends JpaDaoSupport implements ILevelDAO 
{
public void save(Level entity) {
    logger.info("saving Level instance");
    try {
        getJpaTemplate().persist(entity);
        logger.info("save successful");
    } catch (RuntimeException re) {
        logger.error("save failed", re);
        throw re;
    }
}

}

Модульный тест

@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:applicationContext.xml"})
@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=false)
public class LevelDaoImplTests {

 LevelDAO levelDao;

 @Test
 public void shouldSaveNewLevels() {

        levelDao= new LevelDAO();
        Level l = new Level();   
        l.setName = "test";
        levelDao.save(l); 

    }

}

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<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="t1" transaction-type="RESOURCE_LOCAL">
    <provider>
        org.eclipse.persistence.jpa.PersistenceProvider
    </provider>
    <class>com.nlg.model.Level</class>
    <properties>
        <property name="javax.persistence.jdbc.driver"
            value="com.mysql.jdbc.Driver" />
        <property name="javax.persistence.jdbc.url"
            value="jdbc:mysql://myserver.rds.amazonaws.com:3306/" />
        <property name="javax.persistence.jdbc.user" value="myuser" />
        <property name="javax.persistence.jdbc.password" value="mypass" />
    </properties>
</persistence-unit>

applicationContext.xml

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="t1" />
</bean>
<bean id="transactionManager"
    class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory"
        ref="entityManagerFactory" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />
<bean
    id="LevelDAO" class="com.nlg.model.LevelDAO">
    <property name="entityManagerFactory"
        ref="entityManagerFactory" />
</bean>

Сначала я получил это

Недопустимое значение «2.0» атрибута «версия» элемента «постоянство»

Итак, читая другой пост, в котором предлагается изменить это значение на "1.0"

и теперь получаю

java.lang.IllegalStateException: не удалось загрузить ApplicationContext

Эта проблема была решена с помощью тега , но она не устранила мою проблему:

org.springframework.transaction.CannotCreateTransactionException: Не удалось открыть JPA EntityManager для транзакции; вложенным исключением является исключение [EclipseLink-4021] (Eclipse Persistence Services - 1.0.2 (сборка 20081024)): org.eclipse.persistence.exceptions.DatabaseException Описание исключительной ситуации: невозможно получить соединение от драйвера [null], пользователя [null] и URL [null].

Меня беспокоит то, что при понижении версии нет. до "1.0", что я также пропускаю проблему совместимости в этом стеке. У меня работают не весенние версии этих тестов, поэтому любые идеи о том, где я ошибся, оценены.

Спасибо

1 Ответ

3 голосов
/ 12 октября 2011
  • Невозможно получить соединение от драйвера [null], пользователя [null] и URL-адреса [null]

Это свойства JPA 2.0:

 <property name="javax.persistence.jdbc.driver"
        value="com.mysql.jdbc.Driver" />
 <property name="javax.persistence.jdbc.url"
        value="jdbc:mysql://myserver.rds.amazonaws.com:3306/" />
 <property name="javax.persistence.jdbc.user" value="myuser" />
 <property name="javax.persistence.jdbc.password" value="mypass" />

Так что, если вы переключитесь обратно на 1.0, вы, вероятно, захотите:

<property name="eclipelink.jdbc.url" value="jdbc:mysql://myserver.rds.amazonaws.com:3306/"/> 
<property name="eclipelink.jdbc.user" value="myuser"/> 
<property name="eclipelink.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
<property name="eclipelink.jdbc.password" value="mypass"/>

Но тогда я бы порекомендовал решить «эту другую проблему» и остаться с 2.0

Вот пример JPA 2.0 поверх EclipseLink, который работает (уведомление persistence version="2.0"):

<?xml version="1.0" encoding="UTF-8"?>
<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="eclipselinktest" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

    <!-- list all classes -->
    <class>com.codesmuggler.model.User</class>

    <properties>
      <!-- some properties needed by persistence provider:
        - driver
        - db url
        - db user name
        - db user password -->
      <property name="javax.persistence.target-database" value="PostgreSQL"/>
      <property name="javax.persistence.logging.level" value="INFO"/>
      <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
      <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/testdb"/>
      <property name="javax.persistence.jdbc.user" value="testuser"/>
      <property name="javax.persistence.jdbc.password" value="testpassword"/>

      <!-- for testing purpose every time application is launched drop and create tables
        in production mode - this line should be removed or commented out
      -->
      <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />

    </properties>

  </persistence-unit>     
</persistence>

Взгляните на пример полностью

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...