Voj*_*ěch 9 spring hibernate jpa
考虑拥有两个实体经理工厂:
<bean id="writeEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">...</bean>
<bean id="readOnlyEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">...</bean>
Run Code Online (Sandbox Code Playgroud)
然后我想要两个Beans,我将注入正确的持久化上下文:
<bean id="readOnlyManager" class="..MyDatabaseManager">
<bean id="writeManager" class="..MyDatabaseManager">
Run Code Online (Sandbox Code Playgroud)
这个bean看起来像:
public class MyDatabaseManager {
private javax.persistence.EntityManager em;
public EntityManager(javax.persistence.EntityManager em) {
this.em = em;
}
...
}
Run Code Online (Sandbox Code Playgroud)
这显然不起作用,因为EntityManager不是bean,不能以这种方式注入:
No qualifying bean of type 'javax.persistence.EntityManager' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
Run Code Online (Sandbox Code Playgroud)
如何在bean中限定正确的EntityManager?我以前使用@PersistenceContext注释,但这不可用,因为我需要注入它.
如何为这样的Bean指定PersistenceContext?
更新:我的问题是如何通过XML而不是通过注释注入带有限定符的PersistenceContext.
假设您使用 spring 来管理事务,我会做的是 2 个不同的事务管理器,然后在我的服务中我将使用最合适的事务管理器,如下所示:
配置部分
@Bean
public LocalContainerEntityManagerFactoryBean writeEntityManagerFactory() {
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
//Your configuration here
return factory;
}
@Bean(name={"writeTx"})
public PlatformTransactionManager writeTransactionManager() {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(writeEntityManagerFactory().getObject());
return txManager;
}
@Bean
public LocalContainerEntityManagerFactoryBean readEntityManagerFactory() {
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
//Your configuration here
return factory;
}
@Bean(name={"readTx"})
public PlatformTransactionManager readTransactionManager() {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(readEntityManagerFactory().getObject());
return txManager;
}
Run Code Online (Sandbox Code Playgroud)
服务层
@Transactional(value="readTx")
public List<Object> read(){
//Your read code here
}
@Transactional(value="writeTx")
public void write(){
//Your write code here
}
Run Code Online (Sandbox Code Playgroud)
更新的答案 我误解了这个问题。
在您的配置类中您可以定义:
@Bean
public LocalContainerEntityManagerFactoryBean writeEntityManagerFactory() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan(new String[] { "models" });
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(hibProps());
em.setPersistenceUnitName("writer");
return em;
}
@Bean
public LocalContainerEntityManagerFactoryBean readEntityManagerFactory() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan(new String[] { "models" });
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(hibProps());
em.setPersistenceUnitName("reader");
return em;
}
Run Code Online (Sandbox Code Playgroud)
请查看PersistenceUnitName数值
然后你可以通过执行以下操作来注入它们:
@PersistenceContext(unitName="writer")
private EntityManager emWriter;
@PersistenceContext(unitName="reader")
private EntityManager emReader;
Run Code Online (Sandbox Code Playgroud)
我刚刚测试过,一切都很好
安吉洛
| 归档时间: |
|
| 查看次数: |
211 次 |
| 最近记录: |