我刚刚开始使用EJB开发,因此我创建了一个包含以下三个项目的测试系统:
实际上,HelloWorldBeanRemote
项目中也存在EJBTest
接口。我没有找到从其他项目导入它的方法,没有运行时异常。
EJBTestInterfaces
是一个普通的java项目,只包含远程接口。 EJBTest
包含程序逻辑。 HelloWorldBean
是会话bean。它的构造函数将created
字段设置为当前时间。在sayHello()
方法中,它使用注入的PersistenceManager
来检索id为0的TestEntity
(如果它不存在则创建它),递增'hit`变量并返回它:< / p>
@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项目从数据库文件中读取持久化数据?
答案 0 :(得分:1)
您需要将hibernate.hbm2ddl.auto
值从create-drop
更改为validate
或其他值。当SessionFactory关闭时,create-drop
将删除整个模式,并在打开时再次重新创建它。
答案 1 :(得分:0)
一旦重新启动EJB项目,也就是说,当最后一个连接消失时,H2可能会重置数据库。 停止EJB项目并连接到DB以查看预期的数据是否仍然存在。