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

异常javax.Transaction.rollbackException:用GlassFish 4标记为回滚的事务-堆栈跟踪中没有信息

符渊
2023-03-14

我正在使用GlassFish4、Spring和PostgreSQL。我想将一个实体保存到数据库中,但当我尝试时,我得到了一个异常:

其实这对我来说毫无意义。我甚至不知道去哪里看,因为消息的描述性不是很强。您知道如何检索有关此异常的更多信息吗?或者援引它的理由是什么?

persistence.xml:

<?xml version="1.0" encoding="UTF-8"?><persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="amleto-server-model" transaction-type="JTA">
    <jta-data-source>jdbc/amleto</jta-data-source>
    <class>com.amleto.server.model.entities.FacebookDebug</class>
    <properties>
        <property name="openjpa.jdbc.Schema" value="public"/>
        <property name="openjpa.TransactionMode" value="managed" />
        <property name="openjpa.ConnectionFactoryMode" value="managed" />
        <property name="openjpa.jdbc.DBDictionary" value="postgres" />
        <!-- Log all queries performed against the database. -->
        <!-- Do not use in production, this will generate a lot of output. -->
        <property name="openjpa.Log" value="SQL=TRACE"/>
    </properties>
</persistence-unit>

amletoController.java:

package com.amleto.server.services.controllers;

import java.sql.Timestamp;
import java.util.GregorianCalendar;

import javax.persistence.Query;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.amleto.server.model.entities.FacebookDebug;
import com.amleto.server.services.utils.SharedEntityManager;

@Controller
public class AmletoController {

    @Autowired
    SharedEntityManager entityManager;

    @Transactional
    @ResponseBody
    @RequestMapping(value = "/facebookDebug", method=RequestMethod.GET)
    public String facebookDebug(@RequestParam(value="action", required=true) String action, 
                                @RequestParam(value="userId", required=true) String userId) {

            FacebookDebug fb = new FacebookDebug();
            fb.setAction(action);
            fb.setUserId(userId);
            GregorianCalendar dateCreate = new GregorianCalendar();
            fb.setDateCreate(new Timestamp(dateCreate.getTimeInMillis()));
            entityManager.getEntityManager().persist(fb);

            /*
            int returnValue = entityManager.getEntityManager().createNativeQuery("insert into facebook_debug (action, user_id, date_create) values(?,?,current_timestamp)")
                    .setParameter("1", action)
                    .setParameter("2", userId)
                    .executeUpdate();       
            */

            return "why it doesn't work?";
    }
}

facebookdebug.java:

package com.amleto.server.model.entities;

import java.io.Serializable;
import javax.persistence.*;
import java.sql.Timestamp;


/**
 * The persistent class for the facebook_debug database table.
 * 
 */
@Entity
@Table(name="facebook_debug")
@NamedQuery(name="FacebookDebug.findAll", query="SELECT f FROM FacebookDebug f")
public class FacebookDebug implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="facebook_debug_id")
    private Integer facebookDebugId;

    private String action;

    @Column(name="date_create")
    private Timestamp dateCreate;

    @Column(name="user_id")
    private String userId;

    public FacebookDebug() {
    }

    public Integer getFacebookDebugId() {
        return this.facebookDebugId;
    }

    public void setFacebookDebugId(Integer facebookDebugId) {
        this.facebookDebugId = facebookDebugId;
    }

    public String getAction() {
        return this.action;
    }

    public void setAction(String action) {
        this.action = action;
    }

    public Timestamp getDateCreate() {
        return this.dateCreate;
    }

    public void setDateCreate(Timestamp dateCreate) {
        this.dateCreate = dateCreate;
    }

    public String getUserId() {
        return this.userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

}

SharedEntityManager.java:

package com.amleto.server.services.utils;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class SharedEntityManager implements ApplicationContextAware {
    private static ApplicationContext _appCtx;

    @PersistenceContext(name="amleto-server-model")
    private EntityManager em;

    private static SharedEntityManager instance;

    public static SharedEntityManager getInstance() {
        if(instance == null) {
            instance = new SharedEntityManager();
        }
        return instance;
    }

    public EntityManager getEntityManager() {
        if(this.em == null) {
            this.em = _appCtx.getBean(EntityManager.class);
        }
        return this.em;
    }

    @Override
    public void setApplicationContext(ApplicationContext appCtx) throws BeansException {
        _appCtx = appCtx;
    }
}
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>

我回到事务回滚异常,只是在上面的堆栈跟踪中链接。在将附加配置添加到GlassFish日志配置之后,我在异常发生之前获得了以下堆栈跟踪:

[2015-09-21T18:36:15.256+0200][glassfish 4.1][CONFIG][org.eclipse.persistence.session.file:/c:/glassFish4/glassfish/domains/domain2/eclipseapps/amleto-server-ear/amleto-server-services-ws_war/web-inf/lib/amleto-server-model-0.1.0-snapshot.jar_amleto-server-model-0.1.0-snapshot.jar_amleto-server-model.connection]

[2015-09-21T18:36:15.261+0200][glassfishPostgreSQL版本:9.4.4驱动程序:PostgreSQL本机驱动程序版本:PostgreSQL 9.4 JDBC4(build 1202)]]

[2015-09-21T18:36:15.582+0200][glassfish 4.1][信息][org.eclipse.persistence.session.file:/c:/glassFish4/glassfish/domains/domain2/eclipseapps/amleto-server-ear/amleto-server-services-ws_war/web-inf/lib/amleto-server-model-0.1.0-Snapshot.jar_amleto-server-model.connection][tid:_threadid=27_threadname=http-listener-1(2)]

[2015-09-21T18:36:15.858+0200][glassfish 4.1][FINE][org.eclipse.persistence.session.file:/c:/glassFish4/glassfish/domains/domain2/eclipseapps/amleto-server-ear/amleto-server-services-ws_war/web-inf/lib/amleto-server-model-0.1.0-Snapshot.jar_amleto-server-model-0.1.0-Sql][tid:_thread=27_threadname=http-listener-1(2)]

共有1个答案

萧韬
2023-03-14

我猜问题是由于找不到桌子造成的,但我现在还不知道确切的原因。

您可以尝试以下操作:

persistence.xml添加以下内容:

<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>

更新#1:

您可以尝试打印嵌套异常stacktrace,如下所示:

    try {
        entityManager.getEntityManager().persist(fb);
    } catch (Exception x) {

        if (x.getCause() != null) {
            x.getCause().printStackTrace();

            if (x.getCause().getCause() != null) {
                x.getCause().getCause().printStackTrace();
            }
        }
    }
 类似资料:
  • 问题内容: 这可能是一个非常幼稚的问题。 我曾经相信Java 中的a 总是 包含堆栈跟踪。这是正确的吗? 现在看起来我捕获了 没有 堆栈跟踪的异常。是否有意义?是否 可以 在没有堆栈跟踪的情况下捕获异常? 问题答案: 无需堆栈跟踪就可以捕获Java中的Throwable对象: 构造一个具有指定详细消息,原因,启用或禁用原因,启用或禁用 可写堆栈跟踪 的新throwable 。 填写执行堆栈跟踪。此

  • 现在看来,我在没有堆栈跟踪的情况下捕获异常。有道理吗?是否有可能在没有堆栈跟踪的情况下捕获异常?

  • 我有一个带有的堆栈跟踪: [...]原因:ch.ethz.id.wai.lakshmi.engine.common.lakshmiException:处理用户事务时出错。在ch.ethz.id.wai.lakshmi.engine.common.TransactionHelper.commitTransaction(TransactionHelper.java:79)在ch.ethz.id.wai

  • Edit2 @Paradematic在建议重定向而不是抛出异常方面做得很好;这解决了日志记录问题。Play 2中的问题是,重定向需要发生在所谓的范围内,而日期解析器调用并不总是这样。 最初的 有一个问题,即我的application.log被与uri日期解析器操作相关的错误填满,如果给定有效的uri日期,该操作应该成功。 然而,一些用户试图通过输入无效日期来规避这一点,希望获得免费访问付费订阅者专

  • 我试过大多数设置日志记录/应用程序洞察遥测的组合,下面是我试过的一些东西: 的 方法中的 将添加到中的日志生成器 删除自定义错误页异常处理程序,以防发生影响事件 我在Azure中的Web应用程序上设置了环境变量。 我正在使用以下代码生成应用程序洞察中的异常: 一切都不起作用了,我快疯了!非常感谢任何帮助。

  • 问题内容: 如何将异常的堆栈跟踪信息打印到stderr以外的流上?我发现的一种方法是使用getStackTrace()并将整个列表打印到流中。 问题答案: 可以接受or或参数: 也就是说,请考虑将SLF4J之类的记录器接口与LOGBack或log4j之类的记录实现一起使用。