0

我刚刚开始进行 EJB 开发,所以我创建了一个包含以下三个项目的测试系统:

系统总览

实际上,该HelloWorldBeanRemote接口也确实存在于EJBTest项目中。我还没有找到一种方法可以从其他项目中导入它而不会出现运行时异常。

EJBTestInterfaces是一个纯 java 项目,只包含远程接口。EJBTest包含程序逻辑。HelloWorldBean是一个会话 bean。它的构造函数将该created字段设置为当前时间。在该sayHello()方法中,它使用注入PersistenceManager来检索TestEntityid 为 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 项目从数据库文件中读取持久数据?

4

2 回答 2

1

您需要将hibernate.hbm2ddl.auto值从create-droptovalidate或其他值更改。 create-drop当 SessionFactory 关闭时将删除整个架构,并在打开时重新创建它。

于 2013-05-13T09:51:19.117 回答
0

一旦您重新启动 EJB 项目,即最后一个连接消失时,H2 可能会重置 DB。停止您的 EJB 项目并连接到数据库以查看预期的数据是否仍然存在。

于 2013-05-13T10:49:56.270 回答