【问题标题】:Deltaspike @Transactional is not workingDeltaspike @Transactional 不工作
【发布时间】:2016-04-22 18:23:39
【问题描述】:

我正在处理 Seam 到 CDI 的迁移。对于数据库事务,我使用的是 Deltaspike,Javaee6。我已按照 Deltaspike with JTA 文档中的说明进行操作。

Deltaspike with JTA

persistence.xml

<persistence 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" 
         version="2.0">

 <persistence-unit name="XXXX" transaction-type="JTA">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
  <jta-data-source>java:jboss/datasources/jdbc/XXXX</jta-data-source>
  <properties>
     <!-- property name="hibernate.hbm2ddl.auto" value="validate"/ -->
     <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
     <property name="hibernate.cache.use_query_cache" value="false"/>
     <!-- property name="hibernate.cache.use_second_level_cache" value="false"/-->
     <property name="hibernate.show_sql" value="false"/>         
     <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
  </properties>

ResourceProducer.java

@PersistenceUnit(unitName="XXXX")
private EntityManagerFactory entityManagerFactory;

@Produces
@Default
@RequestScoped
public EntityManager create()
{
    return this.entityManagerFactory.createEntityManager();
}

public void dispose(@Disposes @Default EntityManager entityManager)
{
    if (entityManager.isOpen())
    {
        entityManager.close();
    }
}

我正在尝试使用 Deltaspike 中的 @Transactional 注释将值存储到数据库中。我没有看到任何错误,但该值未存储在数据库中。

@Named("accountDetailsAction")
@ConversationScoped
public class AccountDetailsAction implements Serializable {
    @Inject
private EntityManager entityManager;
    ...
    @Transactional
public void saveAccountComment() throws SystemException {
    System.out.println("Entered into saveAccountComments method...");
    Account acct = acctInfo.getAccount();
    acct.setComment(accountForm.getCommentText());
    Date lastEdited = new Date();
    acct.setCommentLastEdited(lastEdited);
    Officer lastEditor = utils.getOfficer();
    acct.setCommentLastEditorEmployeeId(lastEditor.getEmployeeId());
    accountForm.setLastEditDate(lastEdited);
    accountForm.setLastEditor(lastEditor.getEmpIdAndFullName());
}

有人遇到过同样的问题吗?你能指导我解决这个问题吗?有没有我遗漏的配置。

【问题讨论】:

  • 这个问题没有足够的信息。如果该值未存储在数据库中,您是否回溯以查看是否正在调用预期的方法? EntityManager 是否被注入?你在捕捉和压制异常吗?如果您使用 EJB 而不是 CDI(只需更改注释),它是否有效?
  • 大卫,谢谢您的回复。我在问题中添加了方法详细信息,它还在控制台中打印了值。所以我确信这个方法被调用了。对于我使用 Deltaspike Transactional 的注释,import org.apache.deltaspike.jpa.api.transaction.Transactional;
  • 很好的更新,但我看不到你曾经在saveAccountComment 中使用过entityManager。是否已成功注入(非空)?你从哪里得到acctInfo?你熟悉EntityManager的用法吗?
  • 大卫,感谢您的帮助和适当的回应。我测试过的课程非常大。我在其他地方测试过它工作正常。 @Transactional 正在工作。再次感谢!!!
  • 不用担心,很高兴您已经弄清楚了。谢谢你告诉我。

标签: jpa jakarta-ee cdi jta deltaspike


【解决方案1】:

滴滴你尝试在 beans.xml 中启用它

<?xml version="1.0" encoding="UTF-8"?>
<beans bean-discovery-mode="all" version="1.1"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd">
    <interceptors>
         <class>org.apache.deltaspike.jpa.impl.transaction.TransactionalInterceptor</class>
    </interceptors>
</beans>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 2013-11-24
    • 2017-06-04
    • 2021-10-30
    • 1970-01-01
    相关资源
    最近更新 更多