java 容器 事务管理器_java-ee – 如何实现容器管理事务(CMT)?

在尝试持久化ReportBean对象时遇到了javax.persistence.TransactionRequiredException,提示需要在事务中执行操作。代码中已经设置了@TransactionManagement(TransactionManagementType.CONTAINER)以使用容器管理的事务,但问题依然存在。错误可能源于persistence.xml配置或实体管理。文章探讨了如何正确实现Java容器管理事务(CMT)并解决这个问题。
摘要由CSDN通过智能技术生成

我想将一个对象(ReportBean)持久化到数据库,但是我收到了错误消息:

javax.persistence.TransactionRequiredException: Transaction is required to perform this operation (either use a transaction or extended persistence context)

这是一些代码:

实体

@Entity

@Table(name="t_report")

@Access(AccessType.FIELD)

public class ReportBean implements Serializable {

// fields (@Column, etc.)

// setters/getters methods

// toString , hashCode, equals methods

}

允许EntityManager注入的自定义注释(使用@Inject)

import javax.inject.Qualifier;

import static java.lang.annotation.ElementType.*;

import java.lang.annotation.Target;

@Qualifier

@Target({TYPE, METHOD, FIELD, PARAMETER})

@Retention(RetentionPolicy.RUNTIME)

public @interface MyEm {

}

EntityManager提供程序

import javax.enterprise.inject.Produces;

import javax.persistence.EntityManager;

import javax.persistence.PersistenceContext;

import javax.persistence.PersistenceContextType;

public class EntityManagerProvider {

private final String PERSISTENCE_UNIT = "MyPersistenceUnit";

@SuppressWarnings("unused")

@Produces

@MyEm

@PersistenceContext(unitName=PERSISTENCE_UNIT, type=PersistenceContextType.TRANSACTION)

private EntityManager em;

}

ValidateReportAction类 – 具有将报告持久保存到数据库的方法.

我正在努力坚持最重要的进口.

如果我想使用EntityManager创建一个查询(或示例中的NamedQuery),一切正常.

import javax.inject.Inject;

import javax.inject.Named;

import javax.persistence.EntityManager;

import javax.ejb.TransactionAttribute;

import javax.ejb.TransactionAttributeType;

import javax.ejb.TransactionManagement;

import javax.ejb.TransactionManagementType;

import javax.enterprise.context.SessionScoped;

@Named("validateReportAction")

@SessionScoped

@TransactionManagement(TransactionManagementType.CONTAINER)

public class ValidateReportAction extends ReportAction implements Serializable {

private static final long serialVersionUID = -2456544897212149335L;

@Inject @MyEm

private EntityManager em;

@TransactionAttribute(TransactionAttributeType.REQUIRED)

public synchronized String createReport() {

ReportBean report = new Report();

// set report properties

// em.createNamedQuery("queryName").getResultList(); ---- works

em.persist(report)

}

}

问:执行em.persist时,createReport()方法中出现错误.我认为交易是由容器(CMT)管理的,但现在我觉得我错了.我哪里弄错了?实施CMT的正确方法是什么?

这也是我的persistence.xml配置:

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">

org.hibernate.ejb.HibernatePersistence

java:jboss/TimeReportDS

META-INF/orm.xml

....

....

....

value="java:/modelEntityManagerFactory" />

value="org.hibernate.transaction.JBossTransactionManagerLookup" />

如果我的问题中的某些内容不明确,请告诉我.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值