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

如何在使用Spring时注入多个JPA EntityManager(持久化单元)

许涵容
2023-03-14
@Configuration
@EnableJpaRepositories(value = "com.company.read",
        entityManagerFactoryRef = "readingEntityManagerFactory",
        transactionManagerRef = "readingTransactionManager")
@EnableTransactionManagement
public class SpringDataJpaReadingConfiguration {

    @Bean(name = "readingEntityManagerFactory")
    public EntityManagerFactory readingEntityManagerFactory() {
        return Persistence.createEntityManagerFactory("persistence.reading");
    }

    @Bean(name = "readingExceptionTranslator")
    public HibernateExceptionTranslator readingHibernateExceptionTranslator() {
        return new HibernateExceptionTranslator();
    }

    @Bean(name = "readingTransactionManager")
    public JpaTransactionManager readingTransactionManager() {
        return new JpaTransactionManager();
    }

}

@Configuration
@EnableJpaRepositories(value = "com.company.write",
        entityManagerFactoryRef = "writingEntityManagerFactory",
        transactionManagerRef = "writingTransactionManager")
@EnableTransactionManagement
public class SpringDataJpaWritingConfiguration {

    @Bean(name = "writingEntityManagerFactory")
    public EntityManagerFactory writingEntityManagerFactory() {
        return Persistence.createEntityManagerFactory("persistence.writing");
    }

    @Bean(name = "writingExceptionTranslator")
    public HibernateExceptionTranslator writingHibernateExceptionTranslator() {
        return new HibernateExceptionTranslator();
    }

    @Bean(name = "writingTransactionManager")
    public JpaTransactionManager writingTransactionManager() {
        return new JpaTransactionManager();
    }

}
@Repository
public class UserReadingRepository {

    @PersistenceContext(unitName = "persistence.reading")
    private EntityManager em;

    // some useful queries here
}
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">

    <persistence-unit name="persistence.reading" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <non-jta-data-source>ReadingDS</non-jta-data-source>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>

    <persistence-unit name="persistence.writing" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <non-jta-data-source>WritingDS</non-jta-data-source>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>

</persistence>
@PersistenceUnit(unitName = "persistence.reading")
private EntityManagerFactory emf;

最后的修正:由于Vlad的回答,我能够更新代码以使用以下内容(只需确保您还定义了DataSourcebean):

@Bean(name = "readingEntityManagerFactory")
public EntityManagerFactory readingEntityManagerFactory() {
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setPersistenceUnitName("persistence.reading");
    em.setDataSource(dataSource());
    em.setPackagesToScan("com.company");
    em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
    em.afterPropertiesSet();
    return em.getObject();
}

共有1个答案

邓卓
2023-03-14

EntityManageFactory配置不正确。您应该使用LocalContainerEntityManagerFactoryBean:

@Bean(name = "readingEntityManagerFactory")
public EntityManagerFactory readingEntityManagerFactory() {
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setPersistenceUnitName("persistence.reading");
    em.setDataSource(dataSource());
    em.setPackagesToScan("com.company");
    em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
    em.afterPropertiesSet();
    return em.getObject();
}

此外,JPatransActionManager也未配置。应该是这样的:

@Bean(name = "readingTransactionManager")
public PlatformTransactionManager readingTransactionManager(){
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(readingEntityManagerFactory());
    return transactionManager;
}

您需要对EntityManager的读取和写入配置执行相同的操作。

 类似资料:
  • 问题内容: 我需要使用一个数据库进行查询(非修改),而使用一个数据库进行命令(修改)。我正在使用Spring Data JPA,所以我有两个配置类: 在我的存储库中,有时我需要决定与EntityManager一起使用,如下所示: 我使用在我的定义持久性单元的名称 的persistence.xml : 定义了弹簧抛出。奇怪的是,看起来Spring尝试使用持久性单元名称实例化 bean ?我配置错误了

  • 我有一个完全工作的Spring 4 Hibernate应用程序。Hibernate通过<代码> 我知道我可以定义一个像这样的bean,但不知道如何配置它。(我也不想重复配置。) MyTest.java test-context.xml 持久性.xml

  • 我有一个应用程序,它使用位于两个不同数据库中的一组JPA实体。我配置了多个持久性单元。 问题是我想使用模式生成自动生成模式,所有实体都是在两个数据库中创建的。 我在这两方面都有: 是的,我想使用元数据自动获取实体。我不想提供手动脚本,因为我需要使它与实体保持最新。 是否有方法标记由哪个PU生成的实体? 编辑:请注意,在@Table上添加“模式”属性并不能解决问题,因为每个PU将尝试在正确的模式中创

  • 问题内容: 您好,我对hibernate世界非常陌生,似乎遇到了障碍。我需要存储的对象中有一个哈希映射。 事情是,我永远不需要使用此映射进行搜索,排序或做任何事情,我只需要将其与对象一起保存并在加载对象时加载它,因此我希望hibernate可以通过某种方式对其进行序列化然后将其存储在CLOB或BLOB字段中,但是我似乎找不到任何方法。 所以我接下来试图让hibernate保存这样 但这在运行时给了

  • 但是,我有两个实体:角色和用户,它们具有多对多的关系,这由rolesusers表表示。在我的应用程序中,我使用的是JSF2.0,我有一个表单来操作用户数据,还有一个表单,它包含所有角色名称的列表和一个selectBooleanCheckbox来查看用户的角色(如果是,则选中)。此外,它必须有添加或删除rol的可能性(选中或取消选中selectBooleanCheckbox),但当我这样做时,我有两

  • 我对Spring注释和persist有一个误解。我使用的是Spring3.1,带有JPA和Hibernate。我认为persist意味着将实体添加到持久性上下文中(但在提交或刷新之前不要执行任何查询),而注释意味着用事务包装方法。 然而,在这个简短的例子中,当执行指针到达持久性时,它会失败并出现异常,因为name不能为null(db约束)。 如果我交换和,一切正常。然而,我不明白为什么反过来没有,