1

我正在努力使用 WAS8.5 使用简单的 Rest Service + EJB 将实体插入到我的 DB2 数据库中。选择工作正常,因为不需要交易。实体已正确注释。(成功的选择至少证明了这一点)

我总是得到以下异常:

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,它始终为空。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";
 }

我希望有人知道我可以检查什么。不得不更改外观+服务名称。:-/ 问候米

4

2 回答 2

0

根本原因是 websphere 中的一个错误与从 Rest Application 配置类返回的缺失类数组相结合。当我们的 EJB 实现一个接口时,它就不再工作了。EJB 无法识别且未启动事务。

我标记了克里斯的答案,因为它包含更多有用的信息。为此非常感谢!

于 2013-09-16T14:17:44.477 回答
0

@mkuff - 我开发了一个针对 WAS v8.0.0.7 的 ear 项目。

我需要得到正确配置的 EJB 是这样的:

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
@Stateless
public class StateInfo {
    @Inject
    @SomeDatabase
    private EntityManager em;

为了加载 WAS 8.xx 库,我的 Maven pom 使用了依赖项:

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>6.0</version>
        <scope>provided</scope>
    </dependency>

至于@SomeDatabase 注释......这是因为我利用了WAS 的CDI(OpenWebBeans)。这是我的预选赛:

import javax.inject.Qualifier;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;

/**
 * @author Chris Harris
 *
 */
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({FIELD, TYPE, METHOD})
public @interface SomeDatabase {}

然后,我使用生产者:

import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 * @author Chris Harris
 *
 */
public class JPAResourceProducer {
@SuppressWarnings("unused")
@Produces
@PersistenceContext(unitName = "somePuName")
@SomeDatabase
private EntityManager em;
}

这是我的persistence.xml:

<?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="somePuName" transaction-type="JTA">
    <jta-data-source>java:comp/env/someDb</jta-data-source>

这是 web.xml 的相关部分:

<resource-ref id="someDb">
    <res-ref-name>someDb</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

最后,ibm-web-bnd.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-bnd 
xmlns="http://websphere.ibm.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-bnd_1_1.xsd"
version="1.1">

<virtual-host name="default_host" />

<resource-ref name="someDb" binding-name="jdbc/someDb" />

我在 WAS 中定义了一个使用名称 jdbc/someDb 的数据源。

于 2013-09-09T02:57:55.180 回答