坚持实体

时间:2013-05-13 09:45:29

标签: eclipse jpa ejb-3.0 jboss7.x

我刚刚开始使用EJB开发,因此我创建了一个包含以下三个项目的测试系统:

System overview

实际上,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项目从数据库文件中读取持久化数据?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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