kirkegaard
kirkegaard

Reputation: 1138

Transaction is not active using OpenJPA

i have a frustrating problem with my servlet. This is very basic, i'm supposed to add a blog entry to my database table which has 3 columns (id, tittel(title), main(mainbody)). I can load from my database and display in my jsp file. However i can't persist the data to the database and i cant figure out why.

I use postgres as a database.

This is my "saveBlog"-method:

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();
        }

    }

}

This is my entity class:

 @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;
}
}

My 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>

This is the error i get:

HTTP Status 500 - Can only perform operation while a transaction is active.

type Exception report

message Can only perform operation while a transaction is active.

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.apache.openjpa.persistence.InvalidStateException: Can only perform operation while a transaction is active. 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)

StackTrace

Caused by: org.apache.openjpa.persistence.PersistenceException: ERROR: relation "blogg.openjpa_sequence_table" does not exist Position: 28 {prepstmnt 166406485 SELECT SEQUENCE_VALUE FROM blogg.OPENJPA_SEQUENCE_TABLE WHERE ID = ? FOR UPDATE} [code=0, state=42P01] at org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:5001) at org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4961) at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:133) at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:107) at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:59) at org.apache.openjpa.jdbc.kernel.AbstractJDBCSeq.next(AbstractJDBCSeq.java:63) at org.apache.openjpa.util.ImplHelper.generateValue(ImplHelper.java:159) at org.apache.openjpa.util.ImplHelper.generateFieldValue(ImplHelper.java:143) at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignField(JDBCStoreManager.java:774) at org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:492) at org.apache.openjpa.util.ApplicationIds.assign(ApplicationIds.java:468) at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.assignObjectId(JDBCStoreManager.java:758) at org.apache.openjpa.kernel.DelegatingStoreManager.assignObjectId(DelegatingStoreManager.java:135) at org.apache.openjpa.kernel.StateManagerImpl.assignObjectId(StateManagerImpl.java:595) at org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:3051) at org.apache.openjpa.kernel.PNewState.beforeFlush(PNewState.java:44) at org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(StateManagerImpl.java:1072) at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2143) at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2103) at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:2021) at org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81) at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1526) at org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:932) at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:569)

Upvotes: 2

Views: 2911

Answers (2)

cahen
cahen

Reputation: 16676

relation "blogg.openjpa_sequence_table" does not exist

This seems to be straightforward, just create a sequence for the table blogg, more information here.

Upvotes: 1

Si mo
Si mo

Reputation: 979

The problem is your " transaction.rollback();" in the catch method. if commit fails with an exception the connection is not longer active.

Upvotes: 1

Related Questions