无法在Spring Test中打开JPA EntityManager进行事务处理

时间:2011-10-12 02:47:46

标签: spring jpa junit4

我有一个使用Spring 3.0的Java项目,带有MyEclipse IDE的JPA 2.0

尝试将一些基本的dao集成测试转换为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>

起初我收到了这个

元素'persistence'的属性'version'的值'2.0'无效

所以阅读另一篇建议将其改为“1.0”的帖子

现在收到

java.lang.IllegalStateException:无法加载ApplicationContext

该问题已通过&lt;提供者&gt;然而,标签并没有解决我的问题:

org.springframework.transaction.CannotCreateTransactionException:无法打开JPA EntityManager进行交易;嵌套异常是Exception [EclipseLink-4021](Eclipse Persistence Services - 1.0.2(Build 20081024)):org.eclipse.persistence.exceptions.DatabaseException 异常描述:无法从驱动程序[null],用户[null]和URL [null]获取连接。

我担心的是降级版本号。到“1.0”,我也忽略了这个堆栈中的兼容性问题。我有这些测试的非弹簧版本工作,所以任何关于我出错的地方的想法都赞赏。

由于

1 个答案:

答案 0 :(得分:3)

  • 无法从驱动程序[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>

查看example in full