3

我有两个数据源和两个 entityManagerFactory 实例。我试图使用 3.1 的新功能(通过使用 packagesToScan 属性在没有 persistence.xml 的情况下引导 JPA entityManagerFactory)。

为了使用正确的实体管理器工厂实例,我必须使用 Persistence 单元名称来区分,并且在 persistence.xml 中定义 PU 名称正在停止 Spring 包扫描功能。

使用 packagesToScan 功能时如何给出 PU 名称?

我的问题是更多重复是否有一种方法可以在没有 persistence.xml 的情况下为 Spring 的 LocalContainerEntityManagerFactoryBean 提供 persistenceUnitName?

我在上面的帖子中找不到答案或评论。所以重新发布为新问题。

4

2 回答 2

3

是的你可以。这是一个为 Spring 使用注解配置的示例

我发现最好将每个数据源组织到不同的包中。
我的包结构是:

datasource
    |__ converters         <-- holds any custom attribute converters for JPA
    |__ default            <-- for default datasource
    |       |__ model      <-- contains entities for default datasource
    |       |__ repository <-- contains repositories for default datasource
    |__ anotherdatasource  <-- for second datasource
            |__ model      <-- contains entities for second datasource
            |__ repository <-- contains repositories for second datasource

选择一个数据源作为默认数据源,并为它创建一个配置类...

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory", basePackages = { "com.example.datasource.default.repository" })
public class JpaDefaultDatasourceConfig {

    @Primary
    @Bean(name = "dataSource")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("dataSource") DataSource dataSource) {
        return builder.dataSource(dataSource).packages("com.example.datasource.default.model", "com.example.datasource.converters").persistenceUnit("mydefault").build();
    }

    @Primary
    @Bean(name = "transactionManager")
    public PlatformTransactionManager transactionManager(@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

然后为每个后续数据源创建另一个配置类... 注意:使用包来分隔实体/存储库扫描和自始至终使用的命名约定)

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "anotherEntityManagerFactory", transactionManagerRef = "anotherTransactionManager", basePackages = { "com.example.datasource.anotherdatasource.repository" })
public class JpaAnotherDatasourceConfig {

    @Bean(name = "anotherDataSource")
    @ConfigurationProperties(prefix = "another.datasource")
    public DataSource anotherDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "anotherEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean anotherEntityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("anotherDataSource") DataSource anotherDataSource) {
        return builder.dataSource(anotherDataSource).packages("com.example.datasource.anotherdatasource.model", "com.example.datasource.converters").persistenceUnit("anotherName").build();
    }

    @Bean(name = "anotherTransactionManager")
    public PlatformTransactionManager anotherTransactionManager(@Qualifier("anotherEntityManagerFactory") EntityManagerFactory anotherEntityManagerFactory) {
        return new JpaTransactionManager(anotherEntityManagerFactory);
    }
}

您可以使用配置前缀配置每个数据源。对于上面的两个示例,您可以使用

应用程序.yml

## JPA configuration
# This is the configuration for default datasource created by spring
spring:
  datasource:
    url: jdbc:mysql://localhost/default
    username: foo
    password: bar
    driverClassName: com.mysql.jdbc.Driver
    test-on-borrow: true
    test-while-idle: true
    validation-query: select 1;
    # maxActive: 1

# This is the configuration for an additional datasource which we will create ourselves
 another:
  datasource:
    url: jdbc:mysql://localhost/another
    username: foo
    password: bar
    driverClassName: com.mysql.jdbc.Driver
    test-on-borrow: true
    test-while-idle: true
    validation-query: select 1;

您现在不必担心持久性单元的名称(尽管我们确实命名了它们),因为我们已经仔细分离了实体管理器,只查看它们的实体/存储库,您可以简单地注入适用的存储库并使用它而无需不必担心它获取错误的数据源。如果您确实需要持久性单元,您可以按名称要求它@PersistenceUnit(name = "anotherDatasource")

于 2016-04-19T15:26:36.780 回答
2

如果我正确理解您的问题,您想在没有定义时设置persistenceUnit支持的名称?EntityManagerFactorypersistence.xml

当您声明 entityManagerFactory 时,您可以设置一个 persistenceUnitName 属性。例如:

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
  <property name="dataSource" ref="dataSource"/>

  <property name="persistenceUnitName" value="yourPersistenceUnitName"/>

  <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>
  <property name="packagesToScan">
    <list>
      <value>..</value>
      ...
    </list>
  </property>
</bean>     
于 2013-09-18T23:34:19.097 回答