Hibernate JPA 与 JTA 和 Glassfish 应用程序服务器似乎没有提交

2024-03-20

我是 hibernate 的新手,我希望它通过 JNDI 使用来自应用程序服务器的数据库连接。

奇怪的是,它在数据库中创建我的表,但不保存实体。看来,它并没有承诺。

有人在使用 hibernate 时遇到过类似的问题吗?

这是一个小测试 servlet:

public class WriteTest extends HttpServlet
{
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    {
        /*try
        { 
            User user = new User("Hans", "Maulwurf", "[email protected] /cdn-cgi/l/email-protection");

            InitialContext ctx = new InitialContext();
            UserFacadeBean bean = (UserFacadeBean) ctx.lookup("ejb/UserFacadeBeanService");
            bean.persist(user);
        }
        catch (NamingException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }*/

        EntityManager em = JpaUtil.getEntityManagerFactory().createEntityManager();
        //em.getTransaction().begin();

        System.out.println("Begin transfer");

        User user = new User("Hans", "Maulwurf", "[email protected] /cdn-cgi/l/email-protection");
        Adress adress = new Adress("Deppenstraße 3","Deppingen");
        //user.setAddress(adress);

        System.out.println("Save User 'Hans Maulwurf'");

        em.persist(user);
        //em.persist(adress);
        //em.getTransaction().commit();
        em.close();

        System.out.println("Everything went better than expected!");
    }
}

这是小助手类:

public class JpaUtil
{
    private static final EntityManagerFactory emf;

    static
    {
        try
        {
            System.out.println("Initialize EntityManagerFactory...");
            emf = Persistence.createEntityManagerFactory("testPU");
        }
        catch (Throwable ex)
        {
            System.err.println("Initial EntityManagerFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static EntityManagerFactory getEntityManagerFactory()
    {
        return emf;
    }
}

我的用户对象:

@Entity
@Table(name = "T_UserJpa")
public class User implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Embedded
    @AttributeOverrides(
    {
        @AttributeOverride(name = "street", column =
        @Column(name = "user_street")),
        @AttributeOverride(name = "city", column =
        @Column(name = "user_city", length = 50))
    })
    private Adress adress;
    private String firstname;
    private String lastname;
    private String email;

    public User()
    {
    }

    public User(String firstname, String lastname, String email)
    {
        this.firstname = firstname;
        this.lastname = lastname;
        this.email = email;
    }

    public Long getId()
    {
        return id;
    }

    public void setId(Long id)
    {
        this.id = id;
    }

    public Adress getAddress()
    {
        return adress;
    }

    public void setAddress(Adress adress)
    {
        this.adress = adress;
    }

    public String getFirstname()
    {
        return firstname;
    }

    public void setFirstname(String firstname)
    {
        this.firstname = firstname;
    }

    public String getLastname()
    {
        return lastname;
    }

    public void setLastname(String lastname)
    {
        this.lastname = lastname;
    }

    public String getEmail()
    {
        return email;
    }

    public void setEmail(String email)
    {
        this.email = email;
    }

    @Override
    public boolean equals(Object obj)
    {
        if (this == obj)
        {
            return true;
        }
        if (!(obj instanceof User))
        {
            return false;
        }
        final User user = (User) obj;
        return !(email != null ? !email.equals(user.email) : user.email != null);
    }

    @Override
    public int hashCode()
    {
        return 29 * (email != null ? email.hashCode() : 0);
    }
}

我的 persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence">
  <persistence-unit name="testPU" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>jdbc/testdb</jta-data-source>
    <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
      <property name="hibernate.show_sql" value="true"/>
      <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory"/>
      <property name="hibernate.hbm2ddl.auto" value="update"/>
      <property name="hibernate.connection.autocommit" value="true"/>
    </properties>
  </persistence-unit>
</persistence>

编辑:我忘了提及,我已经使用了此线程中提供的信息:在 Glassfish 服务器上配置 Hibernate JPA 2.0 的学习资源 https://stackoverflow.com/questions/3609430/learning-resource-for-configuring-hibernate-jpa-2-0-on-glassfish-server


在应用程序服务器中,您可以管理容器EntityManager(又名持久性上下文)或应用程序管理EntityManager。在这两种情况下,您都必须将持久性上下文与事务关联起来,该事务可以是 JTA 事务,也可以是普通 JDBC 事务。

针对您当前的问题,应考虑以下几点:

  • Your persistence.xml文件表明您打算使用 JTA 数据源,因此使用 JTA 事务来执行事务工作。
  • 另外,你的JpaUtil类负责创建应用程序管理的EntityManager实例。

根据上述两个陈述以及您的应用程序所展示的行为,您的应用程序似乎EntityManager实例不与 JTA 事务关联。因此,在持久性上下文中所做的任何更改都不会被刷新到数据库。这仅仅是因为 JPA 提供者将依赖 JTA 事务和征用的资源来执行事务工作;如果没有找到,则不会完成任何工作(与资源本地事务的情况不同,其中连接池和资源登记由 JPA 提供程序本身执行)。

因此,重点是,EntityManager或者,在对实体执行任何更改之前,持久性上下文必须与活动事务关联,以便对持久性上下文中的实体所做的所有更改都可以刷新到数据库。要解决您的问题,您必须:

  • 启动一个新的 JTA 事务。您可以选择容器管理的事务或应用程序管理的事务。

    • 顾名思义,容器管理的事务完全由容器管理。您无法调用 API 来启动和终止此类事务。相反,您必须在 EJB 内执行所有事务工作。所涉及的 EJB 应该配置为需要容器管理事务的 EJB。演示如何使用 EJB 在您的场景中执行事务工作超出了本答案的范围。如果您还没有学会如何编写 EJB,我建议您阅读有关 EJB 的文章。
    • 应用程序或 Bean 管理的事务由应用程序本身管理,并且 不是通过容器。虽然这可能适合您的情况,但请注意,您现在负责事务管理;这种策略常常会导致错误,而且开发人员常常不能很好地理解它,因此在大多数项目中它通常被认为是一种不好的做法。如果您希望使用 Bean 管理的事务,那么您需要使用UserTransaction http://download.oracle.com/javaee/6/api/javax/transaction/UserTransaction.htmlAPI类如下图:

      public class WriteTest extends HttpServlet
      {
          @Resource
          UserTransaction tx; // a UserTransaction reference is injected like a any other resource. It can also be looked up from JNDI.
      
          public void doGet(HttpServletRequest request, HttpServletResponse response)
          {
              ...
              tx.begin(); // Start a new JTA BMT
              EntityManager em = JpaUtil.getEntityManagerFactory().createEntityManager();
              ...
              User user = new User("Hans", "Maulwurf", "[email protected] /cdn-cgi/l/email-protection");
              Adress adress = new Adress("Deppenstraße 3","Deppingen");
              //user.setAddress(adress);
      
              em.persist(user);
              em.close();
              ...
              tx.commit(); // Commit the JTA BMT
          }
      
      }
      

      上面的代码并不完全适合生产。例如,它不执​​行任何异常处理,也不会在应用程序发生故障时显式回滚更改。

  • 加入EntityManager具有 JTA 事务的实例,如果EntityManager尚未与 JTA 事务关联。如果您首先启动 JTA 事务(在上面涉及 Bean 管理事务的示例中完成),则不需要这样做,但是如果您创建EntityManager首先使用你的JpaUtil类,然后稍后启动事务,那么您必须使用EntityManager.joinTransaction() http://download.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#joinTransaction%28%29将持久性上下文与 JTA 事务连接的方法。很明显,从与事务无关的持久性上下文中刷新的任何更改都将被忽略。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate JPA 与 JTA 和 Glassfish 应用程序服务器似乎没有提交 的相关文章

  • JaxB2Marshaller 未将 XML 绑定到 Kotlin 数据类

    我正在编写一个批处理作业来解析 XML 提取字段并将它们保存在数据库中 解析 XML 时 它会选取 2 个根元素 但将所有字段保留为空 因此在我的数据库中 我有 2 条记录将为空字段 似乎无法弄清楚为什么它无法读取元素 TIA Bean f
  • Java 区域设置区分大小写

    我有以下代码来显示当前区域设置 System out println Locale getDefault System out println new Locale en US 上面给出的输出如下 en US en us 如何构造一个 Lo
  • 在 Spring 中使用事务时创建提交后

    由于某些原因 我使用 Spring PlatformTransactionManager 手动执行事务提交和回滚 我需要做的是设置一个钩子 以便在提交事务后发生提交后操作 通过查看 void commit TransactionStatus
  • 转换为 JSON 后保留 XMLGregorianCalendar 日期格式 - Jackson Lib

    我有一个对象 它有 2 个 XMLGregorianCalendar 对象 一个用于日期 另一个用于时间 我使用 Jackson 对象映射器将日期转换为 JSON 格式 转换前的日期为2014年2月10日 时间为11 15 00 转换为 J
  • 创建UML图时应该编写构造函数吗?

    我有一项作业要求我为实际的 Java 程序创建 UML 图 但程序中有几个构造函数方法 我很困惑 我是否应该将这些构造函数方法添加到图中 根据 UML 规范 2 5 版第 11 4 4 节 构造函数是一个具有所属类类型的单个返回结果参数的操
  • Bean 属性不可读或具有无效的 getter 方法

    因此 我的任务是为注册表路由编写一个简单的 Web 应用程序 使用 Spring MVC 所以我有 路线 类 我想在其中保留起点 终点和中间点列表 但我不明白如何将值从 jsp 放入列表 例如使用 jstl 所以我决定解析一个字符串 pub
  • Java SSO 与 Wildfly 8、Java 1.8.0_45 和 Active Directory

    我对这个主题进行了很多搜索 但找不到解决方案 要求的简短描述 Wildfly 8 2 下 Web 应用程序上的 SSO 在 Active Directory 中验证 Windows 用户的身份 当 SSO 失败时回退到登录表单 在 Wild
  • 在同一个容器但不同的耳朵中使用本地EJB

    我正在尝试在同一个 Glassfish 但不同的耳朵中使用本地 EJB 但是Glassfish找不到本地EJB或者无法消费 我读到了这个 根据 JavaEE 教程 Local bean 的客户端 必须在与其访问的企业 bean 相同的 JV
  • Java DocumentBuilder - XML 文件中的缩进错误

    我尝试使用 DocumentBuilder 用 Ja va 编写一个简单的 XML 文件 我期望 XML 文件如下所示
  • 调用本机方法时返回 java.lang.UnsatisfiedLinkError

    我正在尝试为第三方 DLL 制作 Java 包装器 我创建了自己的 DLL 充当 JNI 和第三方 DLL 之间的中间人 在java中我加载这个DLL很好但是错误java lang UnsatisfiedLinkError sixense
  • 使用 testcontainer 作为 Dockerfile 的一部分运行测试

    我的 dockerfile 看起来像这样 FROM maven 3 jdk 11 slim COPY pom xml COPY src src RUN mvn clean install 这意味着构建的一部分是单元测试的执行 一些单元测试使
  • 错误:找不到符号 ArrayList

    我正在尝试创建某种列表来存储数组 表 中的值 我在这里使用数组列表 但我应该使用列表吗 但是 每次我尝试编译时 它都会引发以下错误 找不到标志 符号 ArrayList类 位置 玩家类 TablePlayer 代码如下 public cla
  • Java 堆分析因 SIGABRT 崩溃

    我正在尝试分析由 C 编写的方法分配并插入的本机内存JVM通过JNI 我安装了 valgrind version valgrind 3 13 0 并尝试使用以下选项运行 JVM valgrind tool massif massif out
  • 无法使用 Jsoup HTML 解析器 Java 实现某些功能

    我无法使用 Jsoup Java 库解析以下场景的一些文本 1 This is b My Text b some other b b text as well b b b non empty tag1 b other text 预期输出 s
  • 在硬件级别模拟按键 - Windows

    我正在寻找一种语言或库 使我能够在最大可能的水平上模拟击键 而无需实际按下按键 我对击键级别的具体衡量标准是 当我的计算机已经运行按键侦听器 例如鼠标键和粘滞键 时 它是否会产生与物理按键相同的输出 我尝试过很多击键模拟的方法 java A
  • Android 调整图片大小

    我的图像存储在 SD 卡上 每个大小约为 4MB 我想调整每个的大小 而不是将其设置为 ImageView 但我不能使用BitmapFactory decodeFile path 因为异常 java lang OutOfMemoryErro
  • Jersey:返回字符串列表

    我尝试以 JSON 和 XML 形式返回 Jersey 中的字符串列表 我以为这会是微不足道的 我的第一次尝试是写这样的东西 GET Produces MediaType APPLICATION JSON MediaType APPLICA
  • java银行程序帐户ID不上去?

    每次创建银行帐户时 帐户 ID 都应增加 1 但每次我尝试提取 Id 时 我只会得到帐户 ID 为 0 任何建议 因为我完全按照我学习的书中的方式进行操作而且它仍然没有更新 帐户构造函数 public class BankAccount p
  • 无法以联觉方式绘制像素、Pi 数

    我想将 pi 数字的每个数字打印为彩色像素 因此 我得到一个带有 pi 数字的输入 然后将其解析为一个列表 每个节点包含一个数字 我知道 稍后我将使用一个数组 但我从来没有把它画到屏幕上 有人能帮我看看我错在哪里吗 import java
  • JVM锯齿状空闲进程

    我目前正在进行一项涉及 JVM 及其内存使用工作原理的研究 我不明白的是 JVM在空闲时用什么填充它的内存 只是为了在堆几乎达到时释放它 为什么使用的内存不只有一条平线 顺便说一句 这个 java 应用程序托管在 glassfish 上 但

随机推荐

  • MySQL统计复杂查询结果?

    我有以下查询 count SELECT COUNT FROM post GROUP BY ID HAVING ID NOT IN SELECT taxiID FROM taxi WHERE userID userID AND value I
  • 在单个请求中渲染多个视图

    我试图在单个请求中返回多个视图 并以 JSON 字符串形式返回它们 Example RequestMapping value my request public void myRequest HttpServletRequest reque
  • 如何为集合提供带有迭代器的 const 接口?

    我想创建一个具有如下签名的函数 Set found to be an iterator to the location of key in map or end if not found bool lookup const Key key
  • 使用 Webbrowser C# 从 iframe 读取 HTML 代码

    如何使用WebBrowser读取IFRAME html代码 我有一个带有 iframe 的网站 点击几次后 新的 URL 会在此 IFRAME 中打开 其中包含 HTML 代码的某些部分 有可能读到这个吗 当我尝试 Navigate 到此
  • 从 GIF 文件的字节数组中提取各个帧的字节数组

    我有一个byte GIF 文件的 我想从中提取所有帧 我可以使用提取帧System Drawing Image and System Drawing Imaging 但这些都需要System Drawing我不能在我的项目中使用它 因为 U
  • 使用 XSLT 转换 Heat 生成的 .wxs(添加RegistryValue 并编辑一些值)

    这是我想要的输出
  • Prolog:覆盖谓词和使用它之间的区别

    我觉得自己真的很愚蠢 感觉自己错过了一些东西 我基本上有两个文件 module pl通用逻辑规则 可重用 state pl一个针对当前场景 在模块文件中 module pl 我已经声明 inside Food Eater T isTime
  • Hadoop MapReduce:可以在一个 hadoop 作业类中定义两个映射器和缩减器吗?

    我有两个独立的 java 类 用于执行两个不同的 MapReduce 作业 我可以独立运行它们 对于这两个作业 它们所操作的输入文件是相同的 所以我的问题是是否可以在一个java类中定义两个映射器和两个缩减器 例如 mapper1 clas
  • 从构造函数初始值设定项抛出异常

    从构造函数初始值设定项抛出异常的最佳方法是什么 例如 class C T0 t0 can be either valid or invalid but does not throw directly T1 t1 heavy object d
  • 为什么查询sqlite数据库时需要创建游标?

    我完全陌生Python sqlite3模块 https docs python org 3 6 library sqlite3 html 以及一般的 SQL 这完全难倒了我 大量缺乏描述cursor objects https docs p
  • 将 JaCoCo 与 SONAR 集成以实现单元和集成测试覆盖

    有没有人尝试使用 ANT 构建配置 JaCoCo 将单元测试和集成测试的覆盖范围转储到 2 个不同的文件中 以便 SONAR 使用它们 这是一个可行的解决方案 为单元测试和集成测试生成报告 该解决方案使用的是append战略 请注意 为了在
  • 具有不同输入的全卷积网络

    我有一个完全卷积神经网络 U Net 可以在下面阅读 https arxiv org pdf 1505 04597 pdf https arxiv org pdf 1505 04597 pdf 我想用它来对图像进行像素分类 我的训练图像有两
  • 无法导入 Materialise CSS JS 反应

    大家 早安 我一直在努力让具体化CSS在我的react app上工作 特别是Javascript文件 我尝试了多种方法 但这是我认为我已经走得更远的一种 在我的 landingpage js 文件中 import React Compone
  • 仅隐藏供应商提供的类的弃用警告

    我们有一个应用程序 其中包含一个非常非常古老的类来连接到专有数据库的 API 此代码会生成大量弃用错误 然后将其记录下来 从而污染我们的日志文件 我们只想基本上忽略此供应商提供的类的弃用错误 但我无法找到执行此操作的最佳方法 我见过的选项
  • Bootstrap:两列居中

    我正在尝试使用 Bootstrap 3 1 实现两列居中布局 我读过这个 如何将 Bootstrap div 与 spanX 类居中 https stackoverflow com questions 9554724 how do i ce
  • 使用 Java 从 Keystore 中导入的证书获取公钥

    我已经创建并下载了证书销售队伍 https ap1 salesforce com 按照中的说明PicketLink 文档 https docs jboss org author display PLINK Picketlink as SP
  • 多租户:每个租户都有单独的数据库

    我们正在开发一个多租户应用程序 在架构方面 我们设计了共享中间层用于业务逻辑 每个租户一个数据库用于数据持久化 也就是说 业务层将为每个租户与数据库服务器建立一组连接 连接池 这意味着应用程序为每个租户维护单独的连接池 如果我们预计大约有
  • Android 画图 PorterDuff.Mode.CLEAR

    我正在开发在 Canvas 上绘图的应用程序 类似于 Android SDK 中的 Finger Paint 演示 我的问题是当我使用时PorterDuff Mode CLEAR 当绘图和画布时 如果我尝试擦除某些内容 它工作正常 但如果我
  • 声明参数化类型同义词的实例

    我有很多适用于向量的函数 即具有类型强制长度的列表 我试图让我的类型更容易编写 即而不是编写 foo Fold Integer v Map Integer Integer v v gt 我正在宣布一个新班级NList所以我可以写foo NL
  • Hibernate JPA 与 JTA 和 Glassfish 应用程序服务器似乎没有提交

    我是 hibernate 的新手 我希望它通过 JNDI 使用来自应用程序服务器的数据库连接 奇怪的是 它在数据库中创建我的表 但不保存实体 看来 它并没有承诺 有人在使用 hibernate 时遇到过类似的问题吗 这是一个小测试 serv