事务未使用 OpenJPA 激活
Transaction is not active using OpenJPA
我的 servlet 有一个令人沮丧的问题。这是非常基本的,我应该向我的数据库 table 添加一个博客条目,它有 3 列(id、tittel(title)、main(mainbody))。我可以从我的数据库加载并显示在我的 jsp 文件中。但是我无法将数据保存到数据库中,我也不知道为什么。
我使用 postgres 作为数据库。
这是我的"saveBlog"-方法:
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();
}
}
}
这是我的实体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;
}
}
我的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 - 只能在事务处于活动状态时执行操作。
输入异常报告
消息只能在事务处于活动状态时执行操作。
说明服务器遇到内部错误,无法完成此请求。
异常
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)
StackTrace
原因: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.flush 安全 (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)
问题出在您的 catch 方法中 " transaction.rollback();"
。如果提交失败并出现异常,则连接不再处于活动状态。
relation "blogg.openjpa_sequence_table" does not exist
这似乎很简单,只需为 table blogg
创建一个序列,更多信息 here。
我的 servlet 有一个令人沮丧的问题。这是非常基本的,我应该向我的数据库 table 添加一个博客条目,它有 3 列(id、tittel(title)、main(mainbody))。我可以从我的数据库加载并显示在我的 jsp 文件中。但是我无法将数据保存到数据库中,我也不知道为什么。
我使用 postgres 作为数据库。
这是我的"saveBlog"-方法:
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();
}
}
}
这是我的实体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;
}
}
我的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 - 只能在事务处于活动状态时执行操作。
输入异常报告
消息只能在事务处于活动状态时执行操作。
说明服务器遇到内部错误,无法完成此请求。
异常
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)
StackTrace
原因: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.flush 安全 (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)
问题出在您的 catch 方法中 " transaction.rollback();"
。如果提交失败并出现异常,则连接不再处于活动状态。
relation "blogg.openjpa_sequence_table" does not exist
这似乎很简单,只需为 table blogg
创建一个序列,更多信息 here。