我有两个数据源和两个entityManagerFactory实例。我试图使用3.1的新功能(引导JPA entityManagerFactory没有persistence.xml通过使用PackagesToScan属性)。
为了使用正确的实体管理器工厂实例,我必须区分使用持久化单元名称和在持久化中定义PU名称。xml正在停止spring包扫描功能。
如何在使用packagesToScan功能时给出PU名称?
我的问题更像是重复的,是否有一种方法为Spring的LocalContainerEntityManagerFactoryBean提供持久性UnitName,而不persistence.xml?
我在上面的帖子中找不到答案或评论。所以转载成了一个新问题。
如果我正确理解了您的问题,您希望设置支持EntityManagerFactory
的persistenceUnit
的名称(如果定义时没有持久性)。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>
是的,你可以。下面是一个使用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