2016-11-04 4 views
0

私はREST呼び出しを受け入れ、いくつかのDB作業を行うアプリケーションを設定しています。私は、persistence.xmlファイルを保持したいのを除いて、Springを使用して注釈ですべてを実行しようとしています。しかし、@PersistenceContextに追加したunitNameというBeanが存在しないというエラーがスローされています。Spring AnnotationのみでJPAとJTAでSpringを使用しようとしています

@Repository 
@Transactional 
public class UserController implements Serializable { 
    private static final long serialVersionUID = 4625223295588959802L; 

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

    @Transactional 
    public void addUser(User user) { 
     em.persist(user); 
    } 

    @Transactional 
    public void deleteAll() { 
     em.createNamedQuery("User.deleteAll").executeUpdate(); 
    } 

    @Transactional 
    public List<User> selectAllRecords() { 
     return em.createNamedQuery("User.findAll").getResultList(); 
    } 
} 

私が持っている他の問題は、私はpersistence.xmlのを使用してLocalContainerEntityManagerFactoryBeanでDataSourceを定義しないために春を入手行う方法です。 AppServerにデータソースを追加しました。

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(basePackageClasses=UserController.class) 
public class DatabaseConfig { 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     EclipseLinkJpaVendorAdapter vendorAdapter = new EclipseLinkJpaVendorAdapter(); 
     vendorAdapter.setGenerateDdl(true); 
     vendorAdapter.setShowSql(false); 

     LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
     factory.setJpaVendorAdapter(vendorAdapter); 
     factory.setPackagesToScan("com.example.jpa.model"); 
     factory.setDataSource(dataSource()); 

     Properties jpaProps = new Properties(); 
     jpaProps.put("eclipselink.weaving", "false"); 
     factory.setJpaProperties(jpaProps); 
     return factory; 
    } 

    @Bean 
    public JpaTransactionManager transactionManager() throws SQLException { 
     JpaTransactionManager txManager = new JpaTransactionManager(); 
     txManager.setEntityManagerFactory(entityManagerFactory().getObject()); 
     return txManager; 
    } 

    public DataSource dataSource() { 
     try { 
      Context initCtx = new InitialContext(); 
      return (DataSource) initCtx.lookup("jdbc/userdb"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      throw new RuntimeException("Unable to lookup datasource", e); 
     } 
    }  
} 

unitNameはpersistence.xmlファイルの名前と一致します。

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 
    <persistence-unit name="PerfJPASpring" transaction-type="JTA"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <jta-data-source>jdbc/userdb</jta-data-source> 
     <class>com.example.jpa.model.User</class> 
    </persistence-unit> 
</persistence> 

これは私が受け取っているエラーです。

Uncaught init() exception created by servlet [DispatcherServlet] in application [PerfJPASpring]: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userController': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'PerfJPASpring' is defined 
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:357) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1219) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:751) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) 
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:668) 
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:540) 
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:494) 
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:244) 
    at [internal classes] 

春のunitNameを使用するために正しい方向に私を指すでしたし、私は、DB Configでデータソースを指定して回避することができますか?

ありがとうございました。

答えて

0

問題が見つかりました。まず、JTAを使用しているので、@ Transactionalを削除してデータソースを削除し、setPersistenceUnitNameに置き換えることができます。これで、persistence.xmlファイルとJTAが使用されます。

サービス:

@Repository 
public class UserController implements Serializable { 
    private static final long serialVersionUID = 4625223295588959802L; 

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

    public void addUser(User user) { 
     em.persist(user); 
    } 

    public void deleteAll() { 
     em.createNamedQuery("User.deleteAll").executeUpdate(); 
    } 

    public List<User> selectAllRecords() { 
     return em.createNamedQuery("User.findAll").getResultList(); 
    } 
} 

データベース設定:

@Configuration 
@EnableJpaRepositories(basePackageClasses=UserController.class) 
public class DatabaseConfig { 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     EclipseLinkJpaVendorAdapter vendorAdapter = new EclipseLinkJpaVendorAdapter(); 
     vendorAdapter.setGenerateDdl(true); 
     vendorAdapter.setShowSql(false); 

     LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
     factory.setJpaVendorAdapter(vendorAdapter); 
     factory.setPackagesToScan("com.example.jpa.model"); 
     factory.setPersistenceUnitName("PerfJPASpring"); 

     Properties jpaProps = new Properties(); 
     jpaProps.put("eclipselink.weaving", "false"); 
     factory.setJpaProperties(jpaProps); 
     return factory; 
    } 

    @Bean 
    public JpaTransactionManager transactionManager() throws SQLException { 
     JpaTransactionManager txManager = new JpaTransactionManager(); 
     txManager.setEntityManagerFactory(entityManagerFactory().getObject()); 
     return txManager; 
    }  
} 
関連する問題