当前位置: 首页 > 知识库问答 >
问题:

如何指定使用哪个实体管理器工厂,而不修改DAO类?

阎修杰
2023-03-14

我有一个Java7/Spring3.2.17应用程序,它必须连接到两个不同的数据库,因此我有两个不同的persistence.xml文件,每个文件都声明自己的持久性单元。

<bean id="emf1" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="myDatasource1" />
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence1.xml" />
    <property name="persistenceUnitName" value="pu1" />
    ...
</bean>

在我的DAO类中,我只是让Spring注入实体管理器:

@PersistenceContext
private EntityManager entityManager;

public void setEntityManager (...) { ... }

Spring抱怨我有两个EM工厂,所以它不知道该用哪一个:

NouniqueBeanDefinitionException:未定义[javax.persistence.EntityManagerFactory]类型的合格bean:应为单个匹配bean,但找到2:emf1,emf2

@PersistenceContext(unitName = "pu1")
private EntityManager entityManager;

public void setEntityManager (...) { ... }

我尝试了几个选项,但所有这些选项都导致相同的错误消息:

  1. 扩展类,以便“重写批注”:
public class MyDao extends TheDaoThatICannotModify {
    @Override
    @PersistenceContext(unitName = "pu2")
    public void setEntityManager (EntityManager em) {
        super.setEntityManager(em);
    }
}
<bean id="entityManager2" factory-bean="emf2" factory-method="getObject" />

<bean id="myDao" class="com.foo.TheDaoThatICannotModify">
    <property name="entityManager" ref="entityManager2" />
</bean>

primary=“true”属性添加到我的EMF2bean(将primary=“false”添加到EMF1)。

共有1个答案

缑智敏
2023-03-14

我把它弄好了...通过只在我自己的类中使用Spring injection,并自己将EM传递给邪恶的DAO:

public class MyDaoSingletonFactoryIsh {
    @PersistenceContext(unitName = "pu2")
    private EntityManager em; // Injected by Spring

    private static TheDaoThatICannotModify dao = null;

    public TheDaoThatICannotModify getDAO() {
        if (dao == null) {
            dao = new TheDaoThatICannotModify();
            dao.setEntityManager(em);
        }
        return dao;
    }
}

我不知道如何称呼这个模式:工厂,单例,包装器?它并不真正适合这些类别中的任何一个,它是它们的一个奇怪的组合。这可能不是一个好兆头,它看起来像一个巨大的代码气味,我更愿意避免它。但至少它起作用了,所以,没有更好的解决方案...

 类似资料:
  • 问题内容: 我在META-INF /文件夹中有一个persistence.xml: 在Java代码中,我从该persistence.xml创建实体管理器facotry 但是我只想动态更改jdbc url / user / password以进行测试,我的计划是将这些参数保存在配置文件中,并根据需要读取它们,所以有没有一种方法可以在我从持久性创建了objectmanagerfactory之后更新它们

  • 问题内容: 一个很长的问题,请忍受我。 我们将Spring + JPA用于Web应用程序。我的团队在讨论如何在注入的(基于泛型的东西对AppFuse中提供的线DAO,我们不使用过的注射某种原因)。我们正在使用“应用程序管理的持久性”。 反对注入a的论点是它太重了,因此不是必需的,这就是我们需要的。而且,由于Spring将为每个Web请求创建一个DAO的新实例(我对此表示怀疑),因此不会有任何并发​

  • http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd“> 但面对这个例外: 任何帮助都将不胜感激...

  • 编辑:堆栈跟踪如下: 下面是persistence.xml:

  • 问题内容: 我为Django模型创建了一个自定义管理器,该管理器返回一个包含Objects.all()子集的QuerySet。我需要将其作为模型的默认管理器,因为我还将创建一个自定义标签,该标签将从任何模型(由参数指定)中检索内容,并且需要对指定模型使用默认管理器。一切正常,除了- Django Admin还使用此特定模型的默认管理器,这意味着并非所有模型实例都出现在admin中。 Django文

  • 但问题是这将只锁定一行,而我想在计算总行数时锁定整个表(实体)。 请指教。