- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要在 Java SE 7.0 环境中使用 JPA 2.0 和 EclipseLink 3.0 对表进行更新,使用非事务性 Informix DB v. 11.50,persistence.xml 是:
<persistence-unit name="pp_pu" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>...</class>
<class>...</class>
<properties>
<property name="javax.persistence.jdbc.url"
value="jdbc:informix-sqli://10.191.78.230:40494/ptpr:informixserver=online_ptpr"/>
<property name="javax.persistence.jdbc.driver" value="com.informix.jdbc.IfxDriver"/>
<property name="javax.persistence.jdbc.user" value="test"/>
<property name="javax.persistence.jdbc.password" value="test"/>
</properties>
</persistence-unit>
当我尝试进行更新时,出现以下错误:
Exception in thread "main" javax.persistence.TransactionRequiredException:
Exception Description: No transaction is currently active
at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionWrapper.throwCheckTransactionFailedException(EntityTransactionWrapper.java:113)
at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionWrapper.checkForTransaction(EntityTransactionWrapper.java:50)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.checkForTransaction(EntityManagerImpl.java:1776)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.executeUpdate(EJBQueryImpl.java:533)
然后我尝试通过以下方法解决该错误:
em.getTransaction().begin();
// Update query
em.getTransaction().commit();
现在我收到以下错误:
Internal Exception: java.sql.SQLException: Transactions not supported
Error Code: -79744
Exception in thread "main" Local Exception Stack:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Transactions not supported
Error Code: -79744
Query: DataModifyQuery(sql="update tg_proteccion_cv
set i_eq_validados=?,
i_eq_a_protegidos=?
where v_id_proteccion=?
and v_cve_cliente=?")
at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicBeginTransaction(DatabaseAccessor.java:230)
at org.eclipse.persistence.internal.databaseaccess.DatasourceAccessor.beginTransaction(DatasourceAccessor.java:239)
at org.eclipse.persistence.internal.sessions.AbstractSession.basicBeginTransaction(AbstractSession.java:479)
at org.eclipse.persistence.sessions.server.ClientSession.addWriteConnection(ClientSession.java:646)
at org.eclipse.persistence.sessions.server.ServerSession.acquireClientConnection(ServerSession.java:246)
at org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:226)
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:207)
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:193)
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeNoSelectCall(DatasourceCallQueryMechanism.java:236)
at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeNoSelect(DatasourceCallQueryMechanism.java:216)
at org.eclipse.persistence.queries.DataModifyQuery.executeDatabaseQuery(DataModifyQuery.java:85)
at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:829)
at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:728)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2863)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1501)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1483)
at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1457)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.executeUpdate(EJBQueryImpl.java:540)
at com.telcel.gsa.dsiee.pprecios.amb_alt.FixProtsCv.updateCV(FixProtsCv.java:70)
at com.telcel.gsa.dsiee.pprecios.amb_alt.FixProtsCv.fix(FixProtsCv.java:88)
at com.telcel.gsa.dsiee.pprecios.amb_alt.FixProtsCv.main(FixProtsCv.java:42)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.sql.SQLException: Transactions not supported
at com.informix.util.IfxErrMsg.getSQLException(IfxErrMsg.java:348)
at com.informix.jdbc.IfxSqliConnect.setAutoCommit(IfxSqliConnect.java:1333)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicBeginTransaction(DatabaseAccessor.java:223)
... 25 more
我使用 JDBC 进行更新没有问题,JPA 是否支持非事务性数据库?出于性能原因,DBA 已关闭 Informix 上的事务支持,并且这一点不会改变。那么,我有什么遗漏的吗?怎么了?
P.D.我使用启用事务的 Informix DB 进行了相同的更新,并且它有效。
最佳答案
最终的工作示例(按照詹姆斯的建议)是:
public class Test {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("pp_pu");
EntityManager em = emf.createEntityManager();
Session session = em.unwrap(Session.class);
session.getLogin().useExternalTransactionController();
em.getTransaction().begin();
int updates = em.createNamedQuery("CgEstatusEntity.updateById")
.setParameter("iCveEstatus", 1)
.setParameter("vDescEstatus", "Test9")
.executeUpdate();
System.out.println(updates);
em.getTransaction().commit();
}
}
关于java - Informix 上的 JPA 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15647024/
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我必须做一个大的更新脚本 - 而不是 SPL(存储过程)。它是为 Informix 数据库编写的。 它涉及将行插入到多个表中,每个表都依赖于前一个表的插入顺序。 我知道我可以通过这样做来访问该序列:
我在 Informix DB 的表中有大约 300 万行。 在加载新数据之前,我们必须删除它。 它在其中一列上有一个主键。 为了删除相同的内容,我想到了使用 rowid 。但是当我尝试 select
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我想在 informix 数据库表中选择列时使用列别名。例如在以下查询中: SELECT hire_dt as "Hire Date" FROM employee 列 Hire_dt 应显示为雇用日期
我必须将我的应用程序连接到客户的 Informix 7.2 旧数据库。 据我所知,理论上应该有一个数据库服务在端口50000上运行。问题是我在操作系统中找不到任何数据库服务。 到目前为止,我只能使用
在 Informix 存储过程中,我有一些情况是这样的:- If val1 > 0 // 1st If Select count(*) of v
我正在将一些 informix SQL 转换为 SQL Server。 下面的查询中的方括号是什么意思? SELECT unique cl_name[1,5] FROM client cl_name
我有一台服务器,并且我知道上面安装了 Informix,但我不知道是谁安装的。有一个闭源客户端连接到该服务器,但除了用户名和密码之外我无法获取任何有关它的信息。我不知道如何连接它,我不知道它的端口号和
在 Informix 存储过程中,我有一些情况是这样的:- If val1 > 0 // 1st If Select count(*) of v
我正在将一些 informix SQL 转换为 SQL Server。 下面的查询中的方括号是什么意思? SELECT unique cl_name[1,5] FROM client cl_name
我是 Informix-SQL 新手。我正在尝试在 Informix 中创建表单。我提到了some resources online 这就是我现在访问数据库的方式dbaccess database_n
是否有引用文档列出 4GL 实际使用的所有功能代码(理想情况下,所有出现在随 4GL RDS 提供的 termcap 中的代码)? 例如: gs - start graphics mode (box-
在 Informix SPL 例程中执行与传统 sleep() 系统调用语义等效的最佳方法是什么?换句话说,只需“暂停” N 秒(或毫秒或其他什么,但几秒就可以了)。我正在寻找一种解决方案,它不涉及将
在 Informix 中将 varchar 类型转换为 Int 类型时遇到问题。 实际上我不知道该值是否真的是 varchar 或不是我想转换为 INT 的值。这是一个沙盒系统。 例如: 我正在尝试运
我想知道是否可以像在 MS SQL 中一样在 Informix 中选择每个第 n 行?! 就像是 SELECT * FROM order by ASC limit 1 OFFSET 4 只是没有用
我在我维护的一些代码中发现他们使用这种格式进行更新查询 UPDATE X=to_date('$var','%iY-%m-%d %H:%M:%S.%F3') ... 但我无法在 Informix 文档中
我已经为 Informix 数据库(版本 IBM Informix Dynamic Server 版本 14.10.FC10AEE)创建了一条插入语句。 这看起来如下: INSERT INTO per
我们的 Solaris 服务器上运行着 Informix,在 /usr/informix/bin 下有几个可执行文件,例如 'dbaccess' 和 'isql' . 例如,当输入“isql -V”时
假设我有以下查询: insert into myTable values ("TEST 1 TEST 2") 然后我选择要输出到 Excel 工作表的描述: select description fr
我是一名优秀的程序员,十分优秀!