EJBException-尝试合并Oracle DB中的实体

问题描述 投票:0回答:1

我有一个旧的Java代码,对java spring还是很陌生,我需要读取json文件并将数据从实体合并到Oracle数据库。我在没有entityManager.merge()的情况下测试了我的代码,并且效果很好。但是现在,我尝试使用merge并获得了EJBException

    javax.ejb.EJBException: EJB Exception: : javax.persistence.TransactionRequiredException: The method public abstract java.lang.Object javax.persistence.EntityManager.merge(java.lang.Object) must be called in the context of a transaction.
    at weblogic.persistence.BasePersistenceContextProxyImpl.validateInvocation(BasePersistenceContextProxyImpl.java:148)
    at weblogic.persistence.BasePersistenceContextProxyImpl.invoke(BasePersistenceContextProxyImpl.java:103)
    at weblogic.persistence.TransactionalEntityManagerProxyImpl.invoke(TransactionalEntityManagerProxyImpl.java:138)
    at weblogic.persistence.BasePersistenceContextProxyImpl.invoke(BasePersistenceContextProxyImpl.java:91)
    at com.sun.proxy.$Proxy592.merge(Unknown Source)
    at be.smals.ideploy.manager.ReleaseManager.updateReleases(ReleaseManager.java:69)
    at be.smals.ideploy.manager.ReleaseManager.getActiveReleaseList(ReleaseManager.java:144)

这是我的代码:

@Stateless
@Local
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public class ReleaseManager {

    private static final Logger LOGGER = LoggerFactory.getLogger(ReleaseManager.class);
    private static final String STATUS_CLOSED = "inactive";
    private static final String STATUS_OPEN = "active";
    private Integer cpt_active = 0;
    private Integer cpt_inactive = 0;

    @PersistenceContext(unitName = "deployment")
    private EntityManager em;

    public void updateReleases() {
        try {
            for (GetReleaseList releaseList : getRelease(STATUS_OPEN)) {
                Service service_active = new Service();
                Release release_active = new Release();
                List<ResponseJson> response = getResponse(STATUS_OPEN);
                service_active.setId(response.get(cpt_active).getResult().getService_id());
                release_active.setService(service_active);
                String releaseId = releaseList.getNumber();
                String releaseId_format = releaseId.replace("CHG","");
                release_active.setId(releaseId_format);
                release_active.setName(releaseList.getShortDescription());
                release_active.setActive(Boolean.TRUE);
                LOGGER.info("RELEASE NUMBER FORMATED : " + releaseId_format);
                em.merge(release_active);
                cpt_active += 1;
            }

            for (GetReleaseList releaseList : getRelease(STATUS_CLOSED)) {
                Service service_inactive = new Service();
                Release release_inactive = new Release();
                List<ResponseJson> response = getResponse(STATUS_CLOSED);
                service_inactive.setId(response.get(cpt_inactive).getResult().getService_id());
                release_inactive.setService(service_inactive);
                String releaseId = releaseList.getNumber();
                String releaseId_format = releaseId.replace("CHG","");
                release_inactive.setId(releaseId_format);
                release_inactive.setName(releaseList.getShortDescription());
                release_inactive.setActive(Boolean.FALSE);
                LOGGER.info("RELEASE NUMBER FORMATED : " + releaseId_format);
                em.merge(release_inactive);
                cpt_inactive += 1;
            }
        }catch (TransactionException ex) {
            throw new TechnicalException(ex);
        }
        Query q = em.createQuery("update Deployment d set d.release = null where d.status.id = :status and  d.release.id in ( select r.id from Release r where r.active = :active) ");
        LOGGER.info("Create Query : " + q);
        q.setParameter("status", State.CREATING);
        q.setParameter("active", Boolean.FALSE);
        int updated = q.executeUpdate();
        LOGGER.info("Updated release.id of " + updated + " deployments");
    }

    // getRelease element for Release entity except service ID
    private List<GetReleaseList> getRelease(String STATUS) {
        Gson gson = new Gson();
        BufferedReader buffer_reader = null;
        LOGGER.info(STATUS);
        try {
            buffer_reader = new BufferedReader(new FileReader("/tmp/snow/Release_manager_"+STATUS+".json"));
            File File_snow = new File("/tmp/snow/Release_manager_"+STATUS+".json");
            boolean exists = File_snow.exists();
            LOGGER.info(String.valueOf(exists));
        }catch (FileNotFoundException ex){
            ex.printStackTrace();
        }
        RESTResponseJson response = gson.fromJson(buffer_reader, RESTResponseJson.class);
        return response.getResult();
    }


    // getServiceID element for Release entity attribute Long service_id
    private static List<ResponseJson> getResponse(String STATUS){
        Gson gson_service = new Gson();
        BufferedReader buffer_reader_service = null;
        try {
            buffer_reader_service = new BufferedReader(new FileReader("/tmp/snow/Service_id_"+STATUS+".json"));
        }catch (FileNotFoundException ex){
            ex.printStackTrace();
        }
        Response response_service = gson_service.fromJson(buffer_reader_service, Response.class);
        return response_service.getResponse();
    }

    public List<Service> getServiceList(){
        TypedQuery<Service> q = em.createQuery("SELECT  s from Service", Service.class);
        List<Service> services = q.getResultList();
        return services;
    }

    public List<ReleaseTO> getInActiveReleaseList() {
        TypedQuery<ReleaseTO> query = em.createQuery("select new be.smals.ideploy.to.ReleaseTO(r.id, r.name) from Release r where r.active=:active ORDER BY UPPER(r.name)", ReleaseTO.class);
        query.setParameter("active", Boolean.FALSE);

        List<ReleaseTO> result = query.getResultList();
        return result;
    }
    public List<ReleaseTO> getActiveReleaseList() {
        updateReleases();
        TypedQuery<ReleaseTO> query = em.createQuery("select new be.smals.ideploy.to.ReleaseTO(r.id, r.name) from Release r where r.active=:active ORDER BY UPPER(r.name)", ReleaseTO.class);
        query.setParameter("active", Boolean.TRUE);

        List<ReleaseTO> result = query.getResultList();
        return result;
    }
    public List<ReleaseTO> getReleaseList() {
        TypedQuery<ReleaseTO> query = em.createQuery("select new be.smals.ideploy.to.ReleaseTO(r.id, r.name) from Release r ORDER BY UPPER(r.name)", ReleaseTO.class);

        List<ReleaseTO> result = query.getResultList();
        return result;
    }
}

提示错误,是@TransactionAttribute不符合我的上下文,如果有人可以解释TransactionAttributeType的差异。我还读到它可能来自@Stateless语句。

java spring merge persistence
1个回答
0
投票

来自https://docs.oracle.com/javaee/6/api/javax/ejb/TransactionAttributeType.html

支持:如果客户端使用事务上下文进行调用,则容器执行与所需情况相同的步骤。

必需:如果在客户端与事务上下文关联时客户端调用企业Bean的方法,则容器在客户端的事务上下文中调用企业Bean的方法。

我认为您需要“必需”

© www.soinside.com 2019 - 2024. All rights reserved.