相关疑难解决方法(0)

为什么不注入EntityManager?

这是我要测试的课程:

@Stateless
public class Finder {
  @PersistenceContext(unitName = "abc")
  EntityManager em;
  public String read(int i) {
    return this.em.find(Employee.class, i).getName();
  }
}
Run Code Online (Sandbox Code Playgroud)

这是单元测试:

public class FinderTest {
  @Test public void testReadingWorks() {
    Finder f = new Finder();
    String name = f.find(1);
    assert(name.length() > 0);
  }
}
Run Code Online (Sandbox Code Playgroud)

问题是EntityManager没有注入,并且NULL在测试期间.我究竟做错了什么?

PS.实际上,我不明白谁将要注入EntityManager.单元测试由JUnit在任何容器之外启动......也许我必须em在测试中手动注入?

java jpa

9
推荐指数
2
解决办法
1万
查看次数

为什么在从jndi.properties注入后在JNDI中找不到数据源?

这是我的persistence.xml:

<persistence>
  <persistence-unit name="MyUnit">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>jdbc/abcDS</jta-data-source>
  </persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)

这是在测试期间应该创建数据源的jndi.properties文件src/test/resources,因为缺少具有真实数据源的真实应用程序服务器:

java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory
jdbc/abcDS=new://Resource?type=DataSource
jdbc/abcDS.JdbcDriver=org.hsqldb.jdbcDriver
jdbc/abcDS.JdbcUrl=jdbc:hsqldb:mem:testdb
jdbc/abcDS.JtaManaged=true
jdbc/abcDS.DefaultAutoCommit=false
jdbc/abcDS.UserName=sa
jdbc/abcDS.Password=
Run Code Online (Sandbox Code Playgroud)

这是测试类:

public class FinderTest {
  @BeforeClass
  public static void startEJB() throws Exception {
    InitialContext ic = new InitialContext();
    ic.lookup("jdbc/abcDS");
  }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,数据源没有创建,这就是我一直看到的:

[...]
javax.naming.NameNotFoundException: Name "jdbc/abcDS" not found.
at org.apache.openejb.core.ivm.naming.IvmContext.federate(IvmContext.java:193)
at org.apache.openejb.core.ivm.naming.IvmContext.lookup(IvmContext.java:150)
at org.apache.openejb.core.ivm.naming.IvmContext.lookup(IvmContext.java:124)
at org.apache.openejb.core.ivm.naming.ContextWrapper.lookup(ContextWrapper.java:115)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at com.XXX.FinderTest.startEJB(FinderTest.java:31)
[...]
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?请帮忙!

PS.顺便说一下它是这样工作的(发生了什么?):

ic.lookup("java:/openejb/Resource/jdbc/abcDS");
Run Code Online (Sandbox Code Playgroud)

java maven-2 hibernate jpa openejb

7
推荐指数
1
解决办法
4850
查看次数

标签 统计

java ×2

jpa ×2

hibernate ×1

maven-2 ×1

openejb ×1