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

如何提到持久性UnitName当包ToScan属性

满雨石
2023-03-14

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

为了使用正确的实体管理器工厂实例,我必须区分使用持久化单元名称和在持久化中定义PU名称。xml正在停止spring包扫描功能。

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

我的问题更像是重复的,是否有一种方法为Spring的LocalContainerEntityManagerFactoryBean提供持久性UnitName,而不persistence.xml?

我在上面的帖子中找不到答案或评论。所以转载成了一个新问题。

共有2个答案

蒙胤
2023-03-14

如果我正确理解了您的问题,您希望设置支持EntityManagerFactorypersistenceUnit的名称(如果定义时没有持久性)。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>     
陶星波
2023-03-14

是的,你可以。下面是一个使用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);
    }
}

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

application.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;

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

 类似资料:
  • 我们有一个旧的企业系统,在persistece中定义了不同的持久性单元。在xml中,许多服务使用entityManager,并用@PersistenceContext(unitName=“some_of_they_unit_names”)等注释。 现在我们用Spring Boot减去较小的后端。因此,在很长一段时间里,jpa配置看起来是这样的: 在应用程序启动时,日志中有一行:“在some_per

  • 我正在尝试使用JPA和EclipseLink来持久化元素。所以我创建了一个类来持久化 等等。我创建了一个类来“使用”: 然后,我有以下persistence.xml: 但是,即使我改变了属性,我也有同样的错误: 线程"main"中的异常javax.persistence.PeristenceException:没有名为MyPU的EntityManager的持久性提供程序(当调用工厂=Persist

  • 我正在尝试设置一个属性,该属性将由我的功能测试中的每个方法使用。问题是它在测试之间并没有持续。 这是我的测试类: 我只希望属性在该类中的所有测试中保持不变。

  • 我试图在Eclipse中测试我的hibernate maven应用程序,当我运行获取enttity类名称的方法时,我得到了以下异常: 这是persistence.xml: 这是使用以下方法的类: 波姆。xml: 我尝试更改持久性的版本号、更改xmlns、提供程序的名称,但仍然是例外。

  • 我正在寻找从经典Akka持久化迁移到Akka持久化类型。在这里找到的Lagom留档:1说“注意:从Lagom持久化(经典)迁移到Akka持久化类型时的唯一限制是需要完全关闭集群。即使所有持久数据都是兼容的,Lagom持久化(经典)和Akka持久化类型也不能共存。” 有人知道这是否适用于服务器可能知道的所有持久实体吗?例如,我使用的服务有3个独立的持久实体。我需要一次迁移所有3个,还是可以一次迁移一

  • EJB 3.0,EJB 2.0中使用的实体bean在很大程度上被持久性机制所取代。 现在,实体bean是一个简单的POJO,它具有与表的映射。 以下是持久性API中的关键角色 - Entity - 表示数据存储记录的持久对象。 可序列化是件好事。 EntityManager - 持久性接口,用于对持久对象(实体)执行添加/删除/更新/查找等数据操作。 它还有助于使用Query接口执行查询。 Per