TransactionRequiredException:没有用于当前线程的具有实际事务的EntityManager-无法可靠地处理“合并”调用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TransactionRequiredException:没有用于当前线程的具有实际事务的EntityManager-无法可靠地处理“合并”调用相关的知识,希望对你有一定的参考价值。

[我们有一些旧的Spring应用程序,其中几乎没有spring-boot注释。我有一种情况,我想使用EntityManager进行合并,但是会抛出“ javax.persistence.TransactionRequiredException:没有可用于当前线程进行实际事务处理的EntityManager-无法可靠地处理“合并”调用”异常。我尝试了其他文章中提供的解决方案,例如在upload()方法级别使用javax.persistent @Trasactional批注,但没有任何效果。这些是我正在使用的类-

ApplicationContextProvider.java

@Service
public class ApplicationContextProvider implements ApplicationContextAware 

  private static ApplicationContext context;

  public static ApplicationContext getApplicationContext() 
    return context;
  

  @Override
  public void setApplicationContext(ApplicationContext ac) throws BeansException 
    context = ac;
  

MyConfigType.java

@Entity
@Table(name = "config_loaded_table")
public class MyConfigType  
  @Id
  private int id;

  @Column(name = "file_name")
  private String fileName;  

    // getters and setters

ConfigUploader.java(抽象类)-

public abstract class ConfigUploader 
    public abstract String upload() throws Exception;

ConfigLoader实现类,其中我正在使用来自entityManager->的合并]

public class MyConfigLoader extends ConfigUploader 

    private int id;
    private String path;

    public MyConfigLoader(int id, String path) 
        this.id= id;
        this.path=path;
    

    @Override
    public String upload() throws Exception 

        try 
            MyConfigType myConfigType = new MyConfigType();
            myConfigType.setFileName("employee.config");

            // at this line I am getting exception. 
            int id = ApplicationContextProvider.getApplicationContext().getBean(EntityManager.class).merge(myConfigType).getId();
            myConfigType.setId(id);

        catch (Exception e) 
            // getting javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'merge' call
           log.error(e); 
        
    

最后,我正在调用ConfigLoader实现的upload()方法的主类-

public class ConfigThread implements Runnable 

    @Override
    public void run() 

        ConfigUploader configLoader = new MyConfigLoader(id,path);
        configLoader.upload(); // calling upload() method here

    

[我们有一些旧的Spring应用程序,其中几乎没有spring-boot注释。我有一种情况,我想使用EntityManager执行合并,但这会抛出“ javax.persistence ....

答案

您需要在@Transactional上添加MyConfigLoader.upload()注释。

以上是关于TransactionRequiredException:没有用于当前线程的具有实际事务的EntityManager-无法可靠地处理“合并”调用的主要内容,如果未能解决你的问题,请参考以下文章