当前位置: 首页 > 知识库问答 >
问题:

在使用RESOURCE_LOCAL事务时,为什么我必须在persistence.xml中指定实体的类名?

谢弘阔
2023-03-14

我正在使用GlassFish 3.1.2和Eclipse4.2。如果使用jta-data-source指定一个JTA事务类型,我可以很高兴地添加一个新类,如果我放置@entity批注,该类将作为实体读取。
现在,如果我将事务类型更改为resource_local,将数据源更改为非JTA,并且添加必要的代码来检索EntityManagerEntityTransaction,在这里我将调用begin()commit()。为了解决这个问题,我必须将我的实体添加到persistence.xml中列出的类中。
现在,这解决了我的问题,但我不明白为什么。根据规范,持久性根中的所有注释类都应该由持久性单元管理,除非指定了exclude-unlist-classes。因此,我将事务类型更改为resource_local这一事实应该不会有什么区别。
有人有答案吗?

编辑:一些额外信息。我有一些导致错误的简单代码,它是在数据库中保存一个货币。持久化以以下形式完成:

@Named( "newCurrencyForm2" )
@RequestScoped
public class NewCurrencyForm
{
    public Currency getCurrency()
    {
        return currency;
    }

    public void createCurrency()
    {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory( "foo" );
        EntityManager manager = factory.createEntityManager();
        EntityTransaction transaction = manager.getTransaction();

        transaction.begin();
        manager.persist( currency );
        manager.getTransaction().commit();
    }

    private Currency currency = new Currency();
}

堆栈跟踪为:

共有1个答案

隗锐进
2023-03-14

我的猜测是,当您将事务类型作为JTA注入时,或者使用容器管理的持久性单元时,会发生什么。但是,当您使用RESOURCE_LOCAL时,您正在管理自己的持久性单元,可能使用persistence.createEntityManagerFactory()。

我还猜测您从未对EntityManagerFactory调用close(),而是将持久性单元重新部署到一个实时服务器

我的猜测是,如果重新启动服务器,或者在重新部署之前关闭()EntityManagerFactory,您的RESOURCE_LOCAL配置将起作用。最有可能发生的情况是,带有旧类的旧持久性单元仍然存在,因此没有新类。

还要确保在进行更改时重新构建jar并正确地重新部署。

 类似资料:
  • 问题内容: 结合使用带有ReactJS的ES5开发,可以将组件描述如下: 在此的示例引用对象本身,这是预期的自然行为。 题 我的问题是: 如何使用ES6创建组件? 知道在JavaScript中使用new运算符时会引用实例化对象本身,因此有人可以告诉我使用bind的真正目的是什么?这和React的内部机制有关吗? 问题答案: 只是核心javascript。这是绑定事件的工作方式。这不是一个React

  • 问题内容: 有时,当我重写方法时,在第一次调用时会出现异常,如下所示: 为什么我们被迫打电话?父类有义务是有意义的,但是更重要的是,我们如何知道需要调用一个方法,而不是等待它崩溃? 问题答案: 为什么我们被迫调用super.method()? 组成Android SDK的类非常复杂。例如,活动和片段都必须执行许多操作才能正常运行(即管理生命周期,优化内存使用,在屏幕上绘制布局等)。要求客户端调用基

  • 关于在最新版本的GCC和Clang中编译有几个问题:实验::filessystems链接器错误 但是现在< code>filesystem已经被c 17接受,所以不再需要< code>experimental或< code>-lstdc fs标志,对吗? 错了,我甚至不能 只给了我< code >实验版本,我怎么能包括正式接受的版本呢?

  • 问题内容: 我使用以下Dockerfile创建了一个Docker容器(已截断): 等等。 所有这些都可以,但是我的问题是软件包的安装方式/位置。 如果我仅使用rvm运行rvm,则会显示“无法找到rvm”,但是如果运行,它会起作用。(我在网上找到了“ -l -c”选项,但不知道它们的作用,也找不到令人满意的解释!) 这不是一个docker问题-这是一个bash / * nix问题-我认为存在一些关于

  • 问题内容: 我创建了一个用于显示工具提示的指令: 对应功能: 应用于此: 这是我观点的一部分,由拥有者的控制器处理 为什么必须调用才能将更改应用到,该更改是早先声明和初始化的? 问题答案: 因为附加到事件的回调超出了angular的范围;angular不知道该函数何时运行/结束,因此摘要循环永远不会运行。 调用或告诉angular更新绑定并触发任何手表。

  • 问题内容: 我做了一个设计为使用ngModel指令附加到元素的指令。如果模型的值与某物匹配,则应将其设置为先前的值。在我的示例中,我正在寻找“ foo”,如果输入的是它,则将其设置回前一个。 我的单元测试在此方面通过的很好,因为它们仅查看模型值。但是在实践中,当“放回”触发器时,不会更新DOM。我们最好的猜测是,设置旧==新可以防止脏检查的发生。我逐步完成了$ setViewValueValue方