【问题标题】:Configuring EJB on JBoss AS 7 using JTA datasources: every statement is commited使用 JTA 数据源在 JBoss AS 7 上配置 EJB:提交每条语句
【发布时间】:2013-05-29 14:57:09
【问题描述】:

大家!

我一直在努力寻找答案,但没有成功。

我尝试使用 Enterprise Java Beans 配置我的应用程序并使其在 JBoss Application Server 7.1.1 下运行。我的应用程序是 Web 应用程序,它使用 servlet 并将其他类作为 EJB 注入。问题是每个语句都被提交,这意味着不支持事务管理。

在我的测试示例中,我有一个包含一组子项的实体(映射到 OneToMany 和属性 CascadeType.ALL 的关系)。如果集合中的记录存在问题(例如不存在的外键),则无法将其插入表中并引发异常。但是,父实体被插入,所以我假设插入是在不同的单独事务中完成的。这完全是不受欢迎的行为,我会尝试解决它。​​

技术参数:

DBMS:Oracle EE 11g

AS:JBoss AS 7.1.1

我的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/">
   <persistence-unit name="OracleEntityManager">
      <jta-data-source>java:jboss/CmaDevDS</jta-data-source>
      <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9iDialect" />
        <property name="hibernate.hbm2ddl.auto" value="none" />
        <property name="hibernate.jdbc.batch_size" value="20" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
        <property name="hibernate.use_sql_comments" value="true" />
      </properties>
   </persistence-unit>
</persistence>

我的EJB

@Stateless(name="EntityWriter")
@TransactionManagement(TransactionManagementType.CONTAINER)
public class EntityWriter {

    @Resource
    private SessionContext context;
    /*@Resource
    UserTransaction ut;*/
    @PersistenceContext(unitName = "OracleEntityManager",type=PersistenceContextType.EXTENDED)
    EntityManager em;

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public EntityMarker insertEntity(EntityMarker entity)throws Exception
    {
        try
        {
            entity = em.merge(entity);
            em.flush();
            return entity;
        }
        catch (Exception e)
        {
            context.setRollbackOnly();
            e.printStackTrace();
            return null;
        }
    }
}

实际上,我尝试了两种 EJB 方法:Container Management Transaction 和 Bean Management Transaction,但都没有像我预期的那样工作。

当我将 bean 注入 servlet 时,我会这样做:

    @EJB(name = "EntityWriter")
    private EntityWriter entityWriter;

现在我认为 bean 很好,可能persistence.xml 中缺少某些内容。

将不胜感激任何想法。提前致谢!

【问题讨论】:

  • 听起来你的 java:jboss/CmaDevDS 不是 JTA 数据源。如果是,语句将参与 JTA 事务。检查您的数据源在服务器中的配置方式。

标签: jpa transactions ejb jboss7.x jta


【解决方案1】:

在我通过 JBoss 管理控制台编辑数据源配置并设置复选框“使用 JTA”后,一切正常。默认情况下未选中。

你是对的,克里斯。谢谢!

【讨论】:

  • 手动执行此操作:在文件 jboss-as-7.1.2-Final\standalone\configuration\standalone.xml 中,我将 developer.jboss.org/thread/229606?tstart=0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 2012-04-23
  • 2012-08-16
相关资源
最近更新 更多