Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring@Transactional在独立应用程序中不工作_Java_Spring_Hibernate_Jpa - Fatal编程技术网

Java Spring@Transactional在独立应用程序中不工作

Java Spring@Transactional在独立应用程序中不工作,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我有一个独立的应用程序,试图在其中填充数据库。 我的应用程序配置如下所示: @Configuration @EnableTransactionManagement @PropertySource(value = { "classpath:classpath property file" }) @ComponentScan(basePackages = { my packages to scan }) public class PersistenceJPAConfig { @Be

我有一个独立的应用程序,试图在其中填充数据库。 我的应用程序配置如下所示:

@Configuration
@EnableTransactionManagement
@PropertySource(value = { "classpath:classpath property file" })
@ComponentScan(basePackages = { my packages to scan })
public class PersistenceJPAConfig {    

    @Bean
    public EntityManagerFactory entityManagerFactoryBean() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource());
        em.setPackagesToScan(new String[] { packages to scan});

        JpaVendorAdapter vendorAdapter = jpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        em.setJpaProperties(additionalProperties());
        em.afterPropertiesSet();

        return em.getObject();
    }

    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
        jpaVendorAdapter.setDatabase(Database.ORACLE);
        return jpaVendorAdapter;
    }

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
        dataSource.setUrl(url);
        dataSource.setUsername(dbUser);
        dataSource.setPassword(dbPassword);
        return dataSource;
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactoryBean());

        return transactionManager;
    }

    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
        return new PersistenceExceptionTranslationPostProcessor();
    }

    Properties additionalProperties() {
        return new Properties() {
            { // Hibernate Specific:
                setProperty("hibernate.hbm2ddl.auto", "validate");
                setProperty("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
            }
        };
    }
}
但是,当我尝试在数据库中持久化某些内容时,注释失败,出现错误: 线程“main”javax.persistence.TransactionRequiredException中出现异常:没有可用的事务EntityManager

在生成的错误堆栈中,我看不到应用了事务性建议

包含事务性注释的文件如下所示:

import org.springframework.transaction.annotation.Transactional;

@Service
public class MyService {

    @Autowired
    private MyDao myDao;

    @Transactional
    public void save(MyEntity e) {
        myDao.save(e);
    }
}
@Repository
public class MyDao {
    @PersistenceContext
    private EntityManager entityManager;

    public void save(MyEntity e) {
        entityManager.persist(e);
    }

}
MyDao类是这样的:

import org.springframework.transaction.annotation.Transactional;

@Service
public class MyService {

    @Autowired
    private MyDao myDao;

    @Transactional
    public void save(MyEntity e) {
        myDao.save(e);
    }
}
@Repository
public class MyDao {
    @PersistenceContext
    private EntityManager entityManager;

    public void save(MyEntity e) {
        entityManager.persist(e);
    }

}
我从Main方法调用函数,如下所示:

public static void main(String[] args) {

    try (AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext()) {
        ctx.scan(CONFIG_PACKAGE);
        ctx.refresh();
        myService = ctx.getBean(MyService.class);
        Thread.sleep(10 * 1000);
        myService.save(entity);
        ...
}
堆栈跟踪如下所示(经过编辑以删除与我的代码有关的过于特定的跟踪):

线程“main”javax.persistence.TransactionRequiredException中的异常:没有可用的事务EntityManager 位于org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:275) 位于com.sun.proxy.$Proxy27.persist(未知源) 在mypackage.MyDao.save(MyDao.java:42) 在mypackage.MyDao$$FastClassBySpringCGLIB$$758201c8.invoke()处 位于org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 位于org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) 在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:157)上 位于org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:179)上 位于org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653) 在mypackage.MyDao$$EnhancerBySpringCGLIB$$9bd3b4fc.save()处 在mypackage.MyService.save处(MyService.java:176) 在mypackage.MyService$$FastClassBySpringCGLIB$$5c0a03f6.invoke()处 位于org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 位于org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:649) 位于mypackage.Run.main(Run.java:109) 有人能帮我解决这个问题吗?我可能做错了什么?
感谢您的帮助

您需要在配置类中添加
@EnableJpaRepositories(basePackages=“base package”)
注释

你能发布完整的堆栈跟踪吗?另外,在
main
方法中,
entity
来自何处?添加了堆栈跟踪。在保存实体对象之前,我正在主方法本身中创建实体对象。您是否尝试在
EntityManager
声明中使用
@Autowired
而不是
@PersistenceContext
?尝试过,但不起作用。添加过,不起作用。此外,不确定该注释将如何帮助事务管理?你能详细说明一下吗?