我使用EntityManager设置与Sql Server的新数据库连接(已经为mySql数据库设置了EM)。但是在启动过程中,由于我的限定词存在一些问题,应用无法区分EntityManager。有人可以告诉我如何区分我的EM吗?
我在persistence.xml文件中添加了必要的配置。 到目前为止,我已经尝试过:
我有休闲课: 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实例的事件。