把什么放到jos-data-persistence.xml中?

时间:2010-10-29 11:16:34

标签: java jpa ejb jndi openejb

我应该在<jta-data-source>的{​​{1}}中放置什么价值?

在glassfish管理面板中,我创建了一个数据源名称persistence.xml。在我的"abcDS"(内部jndi.properties)中,我将其定义为:

src/test/resources

我应该在[...] abcDS=new://Resource?type=DataSource abcDS.JdbcDriver=org.hsqldb.jdbcDriver abcDS.JdbcUrl=jdbc:hsqldb:mem:testdb abcDS.JtaManaged=true [...] 中放置什么?我在网上发现了很多变体,例如:persistence.xml"jdbc/abcDS""java:/abcDS"。哪一个是对的?这有什么规则吗?我知道它与JNDI有关,但是......

我正在尝试在单元测试中创建EMF:

"abcDS"

这就是我在日志中获得的内容:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("abc");

1 个答案:

答案 0 :(得分:37)

问题是Persistence.createEntityManagerFactory("abc")是“自己动手”的API,并没有利用嵌入式EJB容器。您可以非常轻松地在测试用例中获得一个容器EntityManager

与相关的jndi / datasource问题一样,我建议您查看examples.zip中的示例。他们的目的都是为了让你不必开始奋斗。

以下是testcase-injection示例的一个片段,其中显示了如何从容器中获取EntityManager以及其他用于测试的内容。

首先,在测试中添加一个空的ejb-jar.xml或application-client.xml,以打开扫描测试代码:

  • 的src /测试/资源/ META-INF /应用client.xml的

然后,使用@org.apache.openejb.api.LocalClient注释您的测试用例,并使用标准的JavaEE注释进行实际注入。

@LocalClient
public class MoviesTest extends TestCase {

    @EJB
    private Movies movies;

    @Resource
    private UserTransaction userTransaction;

    @PersistenceContext
    private EntityManager entityManager;

    public void setUp() throws Exception {
        Properties p = new Properties();
        p.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
        p.put("movieDatabase", "new://Resource?type=DataSource");
        p.put("movieDatabase.JdbcDriver", "org.hsqldb.jdbcDriver");
        p.put("movieDatabase.JdbcUrl", "jdbc:hsqldb:mem:moviedb");

        InitialContext initialContext = new InitialContext(p);

        // Here's the fun part
        initialContext.bind("inject", this);
    }

由于movieDatabase是我们设置的唯一DataSource,OpenEJB会自动将该DataSource分配给持久性单元,而无需修改persistence.xml。您甚至可以将<jta-data-source><non-jta-data-source>留空,OpenEJB仍然知道该怎么做。

但为了完整起见,这是特定应用程序定义persistence.xml

的方式
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">

  <persistence-unit name="movie-unit">
    <jta-data-source>movieDatabase</jta-data-source>
    <non-jta-data-source>movieDatabaseUnmanaged</non-jta-data-source>
    <class>org.superbiz.testinjection.Movie</class>

    <properties>
      <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
    </properties>
  </persistence-unit>
</persistence>

然后是有趣的部分,在测试中一起使用

public void test() throws Exception {

    userTransaction.begin();

    try {
        entityManager.persist(new Movie("Quentin Tarantino", "Reservoir Dogs", 1992));
        entityManager.persist(new Movie("Joel Coen", "Fargo", 1996));
        entityManager.persist(new Movie("Joel Coen", "The Big Lebowski", 1998));

        List<Movie> list = movies.getMovies();
        assertEquals("List.size()", 3, list.size());

        for (Movie movie : list) {
            movies.deleteMovie(movie);
        }

        assertEquals("Movies.getMovies()", 0, movies.getMovies().size());

    } finally {
        userTransaction.commit();
    }
}