【问题标题】:Transaction is not active using OpenJPA事务在使用 OpenJPA 时处于非活动状态
【发布时间】:2015-12-08 12:14:00
【问题描述】:

我的 servlet 有一个令人沮丧的问题。这是非常基本的,我应该在我的数据库表中添加一个博客条目,它有 3 列(id、tittel(title)、main(mainbody))。我可以从我的数据库加载并显示在我的 jsp 文件中。但是我无法将数据保存到数据库中,我不知道为什么。

我使用 postgres 作为数据库。

这是我的“保存博客”方法:

public void lagreBlogg(Blogg b){
           EntityManager em =      Persistence.createEntityManagerFactory("kimsBlogg").createEntityManager();
            EntityTransaction transaction = em.getTransaction();

           try {
            transaction.begin();
            em.persist(b);
            transaction.commit();
        } catch (Exception e) {
            transaction.rollback();

        } finally {
            em.close();
        }

    }

}

这是我的实体类:

 @Entity
 @Table(schema = "blogg", name = "blogg")
 public class Blogg {
@Id
@GeneratedValue
private int id;
private String tittel;
private String main;


public Blogg() {

}

public Blogg(String tittel, String main){
    this.tittel= tittel;
    this.main = main;
}

public String getTittel() {
    return tittel;
}

public void setTittel(String tittel) {
    this.tittel = tittel;
}

public String getMain() {
    return main;
}

public void setMain(String main) {
    this.main = main;
}
}

我的 persistence.xml

<?xml version="1.0" encoding="UTF-8" ?>
<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"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">

<persistence-unit name="kimsBlogg">
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl
    </provider>

    <class>no.kim.model.Blogg</class>




    <properties>
        <property name="javax.persistence.jdbc.logging.level" value="INFO" />
        <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
        <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/postgres" />
        <property name="javax.persistence.jdbc.user" value="postgres" />
        <property name="javax.persistence.jdbc.password" value="krheggen" />
        <property name="openjpa.RuntimeUnenhancedClasses" value="supported" />
    </properties>
</persistence-unit>

这是我得到的错误:

HTTP 状态 500 - 只能在事务处于活动状态时执行操作。

输入异常报告

message 只能在事务处于活动状态时执行操作。

描述服务器遇到了一个内部错误,导致它无法完成这个请求。

异常

org.apache.openjpa.persistence.InvalidStateException:只能在事务处于活动状态时执行操作。 org.apache.openjpa.kernel.BrokerImpl.assertTransactionOperation(BrokerImpl.java:4732) org.apache.openjpa.kernel.BrokerImpl.rollback(BrokerImpl.java:1543) org.apache.openjpa.kernel.DelegatingBroker.rollback(DelegatingBroker.java:940) org.apache.openjpa.persistence.EntityManagerImpl.rollback(EntityManagerImpl.java:598) no.kim.helpers.BloggDAO.lagreBlogg(BloggDAO.java:37) no.kim.Controller.BloggServlet.doPost(BloggServlet.java:33) javax.servlet.http.HttpServlet.service(HttpServlet.java:650) javax.servlet.http.HttpServlet.service(HttpServlet.java:731) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

堆栈跟踪

原因:org.apache.openjpa.persistence.PersistenceException:错误:关系“blogg.openjpa_sequence_table”不存在 位置:28 {prepstmnt 166406485 SELECT SEQUENCE_VALUE FROM blogg.OPENJPA_SEQUENCE_TABLE WHERE ID = ?更新} [代码=0,状态=42P01] 在 org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:5001) 在 org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4961) 在 org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:133) 在 org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:107) 在 org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:59) 在 org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:63) 在 org.apache.openjpa.util.ImplHelper.generateValue(ImplHelper.java:159) 在 org.apache.openjpa.util.ImplHelper.generateFieldValue(ImplHelper.java:143) 在 org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignField(JDBCStoreManager.java:774) 在 org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:492) 在 org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:468) 在 org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignObjectId(JDBCStoreManager.java:758) 在 org.apache.openjpa.kernel.DelegatingStoreManager.assignObjectId(DelegatingStoreManager.java:135) 在 org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:595) 在 org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:3051) 在 org.apache.openjpa.kernel.PNewState.beforeFlush(PNewState.java:44) 在 org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(StateManagerImpl.java:1072) 在 org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2143) 在 org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2103) 在 org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:2021) 在 org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81) 在 org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1526) 在 org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:932) 在 org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:569)

【问题讨论】:

  • 问题是你的“transaction.rollback();”在 catch 方法中。请打印出异常。如果提交因异常而失败,则连接不再处于活动状态
  • 添加了 persistence.xml
  • 关于标题,和Servlets无关,应该是“Transaction is not active using OpenJPA”之类的东西
  • 提供了BloggDAO(错误的来源)。第 37 行是 saveBlog-method 中的这一行“catch (Exception e) {”
  • 您应该在catch () 块中打印(或记录)异常,而不仅仅是忽略它。它很可能会告诉您问题的真正原因。

标签: java postgresql servlets jpa openjpa


【解决方案1】:

关系“blogg.openjpa_sequence_table”不存在

这似乎很简单,只需为表blogg创建一个序列,更多信息here

【讨论】:

    【解决方案2】:

    问题是你在 catch 方法中的" transaction.rollback();"。如果提交因异常而失败,则连接不再处于活动状态。

    【讨论】:

    • 为什么投反对票?这是解决方案...如果提交失败,则回滚(自动)并且事务处于非活动状态。
    • 但是提交应该可以工作。这就是问题所在,我不知道它为什么要回滚()。这就是我需要的解决方案
    • 但是异常的堆栈跟踪是什么?在 catch (Exception e) { transaction.rollback(); ?
    • 没有,因为“transaction.rollback();”行另一个例外发生。这是一个例外:“只能在事务处于活动状态时执行操作”。但是您不会从“ transaction.commit(); } catch (Exception e) {” 行打印异常。请添加一个 e.printStacktrace() 而不是 transaction.rollback。
    • 是的,这是根本原因。它是由于注释@GeneratedValue 而发生的。我不知道您必须更改什么,但请查看 openjpa 的文档。有这个表的描述 - openjpa.apache.org/builds/1.2.3/apache-openjpa/docs/…“表:要使用的序列号表的名称。默认为 OPENJPA_SEQUENCE_TABLE”(请支持我的回答 :-),因为它是正确的)或者看看这个帖子stackoverflow.com/questions/9874500/…
    猜你喜欢
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2016-08-19
    • 2021-03-19
    • 2011-03-09
    • 1970-01-01
    相关资源
    最近更新 更多