我刚刚开始进行 EJB 开发,所以我创建了一个包含以下三个项目的测试系统:
实际上,该HelloWorldBeanRemote
接口也确实存在于EJBTest
项目中。我还没有找到一种方法可以从其他项目中导入它而不会出现运行时异常。
这EJBTestInterfaces
是一个纯 java 项目,只包含远程接口。EJBTest
包含程序逻辑。HelloWorldBean
是一个会话 bean。它的构造函数将该created
字段设置为当前时间。在该sayHello()
方法中,它使用注入PersistenceManager
来检索TestEntity
id 为 0 的对象(如果不存在则创建它),递增 ´hit` 变量并返回它:
@PersistenceContext(name="manager1")
private EntityManager em;
@Override
public String sayHello() {
String info;
if (em == null)
info = "Entity Manager is null";
else {
TestEntity entity;
try {
entity = em.find(TestEntity.class, 0);
entity.setHits(entity.getHits() + 1);
em.merge(entity);
info = "Hit entity " + entity.getHits() + " times.";
} catch(Exception x) {
entity = new TestEntity();
em.persist(entity);
info = "Never used entity bean before.";
}
}
return "Hello! I was created at " + created.toString() + "<br>" + info;
}
持久化单元在 persistence.xml 中定义如下:
<persistence>
<persistence-unit name="manager1">
<jta-data-source>java:jboss/datasources/AppointmentDS</jta-data-source>
<jar-file>../EJBTest.jar</jar-file>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<!-- also tried value="validate" -->
</properties>
</persistence-unit>
</persistence>
它使用在standalone.xml 中定义的嵌入式数据库:
<datasource jndi-name="java:jboss/datasources/AppointmentDS" pool-name="AppointmentDS" enabled="true" use-java-context="true">
<connection-url>jdbc:h2:file:[path to file]</connection-url>
<driver>h2</driver>
<security>
<user-name>sa</user-name>
<password>sa</password>
</security>
</datasource>
servlet 基本上输出以下的返回值sayHello()
:
doGet(...) {
//get initial context ...
bean = (HelloWorldBeanRemote)initialContext.lookup(name);
output.write(bean.sayHello());
}
如果我现在通过 Web 浏览器调用 servlet,我会得到预期的输出:创建日期和“以前从未使用过实体 bean”。如果我刷新页面,创建日期不会改变,但点击计数会增加。我可以在不更改此行为的情况下重新启动 servlet 项目。命中计数稳步增加。
但是,如果我重新启动 EJB 项目,一切都会重置为零。这是创建日期的预期行为,但应从数据库中读取命中计数。但事实并非如此。
我可以在指定的目录中看到创建的数据库文件,它们似乎包含数据(我只是在文本编辑器中打开了文件)。
我应该像以前那样使用会话 bean 吗?我不确定是否必须在请求后关闭 bean(以便事务可以提交)。
如何让 EJB 项目从数据库文件中读取持久数据?