シンプルなRest Service + EJBを使用してエンティティをDB2データベースに挿入するのにWAS8.5で苦労しています。トランザクションは必要ないため、選択は正常に機能します。エンティティには正しく注釈が付けられています。(成功した選択は、少なくともそれを証明します)
私は常に次の例外を受け取ります。
javax.persistence.TransactionRequiredException: No active transaction for PuId=project.ear#included.war#persistence-unit-name
[29.08.13 15:14:59:714 CEST] 00000071 SystemErr R at com.ibm.ws.jpa.management.JPATxEntityManager.getEMInvocationInfo(JPATxEntityManager.java:221)
[29.08.13 15:14:59:714 CEST] 00000071 SystemErr R at com.ibm.ws.jpa.management.JPATxEntityManager.getEMInvocationInfo(JPATxEntityManager.java:179)
[29.08.13 15:14:59:714 CEST] 00000071 SystemErr R at com.ibm.ws.jpa.management.JPAEntityManager.persist(JPAEntityManager.java:143)
[29.08.13 15:14:59:714 CEST] 00000071 SystemErr R at com.TestFacade.testEMInsert(TestFacade.java:72)
私のpersistence.xml(META-INFに配置):
<?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="persistence-unit-name"
transaction-type="JTA">
<!-- <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> -->
<!-- <provider>com.ibm.websphere.persistence.PersistenceProviderImpl</provider> -->
<jta-data-source>jdbc/test-services-ds</jta-data-source>
<class>com.EntityTest</class>
<properties>
<!--<property name="openjpa.RuntimeUnenhancedClasses" value="supported"/>-->
<property name="openjpa.Log" value="SQL=TRACE"/>
<!-- PrintParameters will show query parameters, remove when development has been finished -->
<!-- <property name="openjpa.ConnectionFactoryProperties" value="PrettyPrint=true, PrettyPrintLineLength=72, PrintParameters=true"/> -->
<property name="openjpa.jdbc.Schema" value="LKWSQL"/>
<property name="openjpa.TransactionMode" value="managed"/>
<property name="openjpa.ConnectionFactoryMode" value="managed"/>
<property name="openjpa.jdbc.DBDictionary" value="db2"/>
</properties>
</persistence-unit>
</persistence>
persistence.xml が読み込まれるので、耳のパッケージングは問題ないようです。JavaEE6では戦争で十分であることは知っていますが、それはすでに既存のプロジェクト設定でした。私たちの前のチームはユーザー管理トランザクションに切り替えましたが、誰かが間違いを指摘するのを手伝ってくれることを願っています.
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED) // default, but was worth a try
@Path("servicepath")
public class TestFacade implements ITestFacade {
@Inject
private SearchService searchService;
@PersistenceContext(unitName="persistence-unit-name")
private EntityManager em;
検索サービスが最初の問題を引き起こしました。@EJB では常に null でした。CDIからの@Injectが機能しました。多分それは手がかりですか?
@GET
@Path("testInsert/")
@Produces({ MediaType.TEXT_PLAIN })
public String testEMInsert() {
try{
System.out.println("testing Insert: " + em.isOpen()); // open is true
EntityTest e = new EntityTest("name");
em.persist(e);
} catch (Exception e){
e.printStackTrace();
return e.getMessage();
}
return "OK";
}
私が何をチェックできるか、誰かが知っていることを願っています。ファサードとサービスの名前を変更する必要がありました。:-/ ご挨拶