@Qualifier不考虑不同的持久性单元-EntityManager产生

时间:2019-07-26 10:59:03

标签: java-ee cdi entitymanager qualifiers

我使用EntityManager设置与Sql Server的新数据库连接(已经为mySql数据库设置了EM)。但是在启动过程中,由于我的限定词存在一些问题,应用无法区分EntityManager。有人可以告诉我如何区分我的EM吗?

我在persistence.xml文件中添加了必要的配置。 到目前为止,我已经尝试过:

  1. 为mySql和SqlServer单元创建了限定词。
    • 带注释的注入字段,构造函数,产生方法等
    • 甚至尝试为EntityManagerProducer创建两个不同的类并仅对其进行批注,但仍然无法正常工作。
    • 在我的DAO都使用的抽象类中注释了注入的EM(每个EntityManager注入都有两个不同的抽象类)。
  2. 列出了所有已加载的bean-结果,我可以看到没有考虑到我的预选赛 限定词:[javax.enterprise.inject.Default,javax.enterprise.inject.Any,javax.inject.Named],EntityManagerProducer ...

我有休闲课: EntityManagerFactoryProducer和EntityManagerProducer。

     @ApplicationScoped
        public class EntityManagerFactoryProducer {
          private static EntityManagerFactory mySqlEMFactory;
          private static EntityManagerFactory sqlServerEMFactory;
          public static EntityManagerFactory getEMFactoryMySql() {
                if( mySqlEMFactory != null ) return mySqlFactory;
                return createEMFactoryMySql();
          }
          public static EntityManagerFactory getEMFactorySqlServer() {
                if( sqlServerEMFactory != null ) return sqlServerEMFactory;
                return createEMFactorySqlServer();
          }
          private static synchronized EntityManagerFactory createEMFactoryMySql() {
                // To avoid race conditions
                if( mySqlEMFactory != null ) return mySqlEMFactory;
                String unitName = "mysql";
                mySqlEMFactory = Persistence.createEntityManagerFactory( unitName );
                return mySqlEMFactory;
          }
          private static synchronized EntityManagerFactory createEMFactorySqlServer(){
                // To avoid race conditions
                if( sqlServerEMFactory!= null ) return sqlServerEMFactory;
                String unitName = "sqlServer";
                sqlServerEMFactory= Persistence.createEntityManagerFactory( unitName );
                return sqlServerEMFactory;
          }
          @Produces @MySql @ApplicationScoped
          public EntityManagerFactory createEntityManagerFactoryMySql(){        
           return getEMFactoryMySql();
          }
          @Produces @MySql @ApplicationScoped
          public EntityManagerFactory createEntityManagerFactorySqlServer(){
           return getEMFactorySqlServer();
          }
          public void dispose( @Disposes EntityManagerFactory emFactory ){
                if( emFactory.isOpen() ) emFactory.close();
          }
        }

        public class EntityManagerProducer {
          @Inject @MySql private EntityManagerFactory mySqlemFactory;
          @Inject @SqlServer private EntityManagerFactory sqlServerFactory;
          protected EntityManagerProducer() {}
          public EntityManagerProducer( EntityManagerFactory mySqlemFactory, 
          EntityManagerFatory sqlServerFactory) {
                this.mySqlemFactory= mySqlemFactory;
                this.sqlServerFactory= sqlServerFactory;
          }
          @Produces @RequestScoped
          public EntityManager createEntityManagerForMySql() {
                return mySqlemFactory.createEntityManager();
          }
          @Produces @RequestScoped
          public EntityManager createEntityManagerForSqlServer() {
                return sqlServerFactory.createEntityManager();
          }
          public void close( @Disposes EntityManager em ){
                if( em.isOpen() ) em.close();
          }
        }
        //second looks the same
        Qualifier
        @Retention(RetentionPolicy.RUNTIME)
        @Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE})
        public @interface MySql {
        }



 // And then usage of EM in abstract class for all mySql DAO's
   //Sql Server EM is injected the same way in his abstract class for DAO's
    public abstract class AbstractBaseReadDao <T extends BaseEntity> {
      @Inject @MySql private EntityManager em;
      protected AbstractBaseReadDao() {}
      protected AbstractBaseReadDao( EntityManager em ) { this.em = em; }
      //...
    }

经过多次尝试,我总是遇到相同的错误

  

“ AM org.apache.webbeans.component.AbstractInjectionTargetBean   postConstructDefault严重:执行时发生错误   [@PostConstruct。] javax.persistence.PersistenceException:   org.hibernate.exception.SQLGrammarException:无效的对象名称   '人'。造成原因:   com.microsoft.sqlserver.jdbc.SQLServerException:无效的对象名称   “人””

在启动即时消息服务上,该服务使用MySql数据库-table PERSON授权用户。所以我收到此错误,因为具有Sql Server配置的EM试图从表PERSON中选择人员(在Sql Server数据库中没有表PERSON),并且它应将EM用于MySql。 第二个想法是,根据我放置注释的位置,app有时不是为Sql Server创建EM实例的事件。

0 个答案:

没有答案