簡體   English   中英

改為配置Spring事務或EJB CMT

[英]Configure Spring transactions or EJB CMT instead

我試圖用Hibernate配置Spring Boot:

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;

import org.datalis.plugin.database.dao.TerminalsService;
import org.datalis.plugin.database.models.TerminalsModel;
import org.hibernate.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Qualifier("terminalsService")
public class TerminalsDaoHibernate implements TerminalsService {

    @Autowired
    private EntityManager entityManager;

    @Override
    @Transactional
    public TerminalsModel getTerminalToken(String terminalToken) throws Exception {
        TerminalsModel terminal = null;
        Session session = entityManager.unwrap(Session.class);
        try {

            entityManager.getTransaction().begin();
            terminal = (TerminalsModel) session.get(TerminalsModel.class, terminalToken);
            session.getTransaction().commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
            throw new Exception("Error");
        }
        return terminal;
    }
}

但是我得到這個錯誤:

14:47:34,323 ERROR [stderr] (default task-1) java.lang.IllegalStateException: Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead
14:47:34,323 ERROR [stderr] (default task-1)    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:255)

正確配置@Transactional的正確方法是什么? 我需要使用事務處理嗎?

您正在使用@Transactional ,但仍在嘗試手動啟動事務。 可以執行手動交易管理(即,刪除@Transactional ),也可以通過刪除手動交易管理代碼來接受@Transactional

@Override
@Transactional
public TerminalsModel getTerminalToken(String terminalToken) throws Exception {
    TerminalsModel terminal = null;
    Session session = entityManager.unwrap(Session.class);
    return (TerminalsModel) session.get(TerminalsModel.class, terminalToken);
}

但是我不明白為什么您要在這里使用純Hibernate而不是JPA。 使用JPA可以達到相同的結果。

@Override
@Transactional
public TerminalsModel getTerminalToken(String terminalToken) throws Exception {
    return entityManager.find(TerminalsModel.class, terminalToken);
}

通常,無需使用JPA API的當前狀態在JPA上使用普通的Hibernate API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM