我是Spring的新手,但总的来说我知道它的功能所以我决定在我的一个项目中使用它。然而,主要的问题是Hibernate。在介绍春天的想法之前,前提是:
我的应用程序(不是Web)必须连接到数据库并使用“persistence_1.xml”从它收集信息,并使用它自己的实体类集。换句话说,与“persistence_1.xml”相关的所有内容都是只读的,因此不会发生悲剧。具有名称“p1”的持久性单元的“persistence_1.xml”也来自web-app依赖项。所以图片是这样的:我的应用程序(非web)在maven的支持下编写,将其他应用程序的依赖关系访问数据库并收集信息。
我创建了持久性单元名称为“p2”的另一个“persistence_2.xml”及其自己的实体子集,用于将收集和处理的信息存储到同一个数据库中。
所以最初我有两个实体经理负责“p1”另一个负责“p2”。
我在互联网上看到了一些材料,它们展示了如何使用不同的dataSource配置两个实体管理器,但我无法弄清楚如何使用自己的ENTITIES集在SPRING中创建两个实体管理器。
假设“test”仅与“UserEntity”相关联,而“dummy”仅与“DumbEntity”相关联。
现在一切都被淹没了,无论我在@PersistenceContext(name =“test”)中输入哪个PU名称 - 它都可以查询数据库中的任何实体。
这是persistence.xml:
<persistence-unit name="test" type="RESOURCE_LOCAL">
<class>org.test.db.UserEntity</class>
</persistence-unit>
<persistence-unit name="dummy" type="RESOURCE_LOCAL">
<class>org.test.db.DumbEntity</class>
</persistence-unit>
Bean定义:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="url" value="jdbc:mysql://localhost:3306/spring"/>
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="persistenceUnitName" value="test" />
<property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="true" />
<property name="showSql" value="true" />
<property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" />
</bean>
</property>
</bean>
<bean id="entityManagerFactory2" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="persistenceUnitName" value="dummy" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="true" />
<property name="showSql" value="true" />
<property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" />
</bean>
</property>
</bean>
<tx:annotation-driven/>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<bean id="transactionManager2" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory2"/>
</bean>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
<bean name="userDao" class="org.test.services.UserDaoImpl" />
我的UserDaro服务
public class UserDaoImpl implements UserDao {
@PersistenceContext(unitName = "test")
private EntityManager entityManager;
public UserDaoImpl() {
}
public UserDaoImpl(EntityManager entityManager) {
this.entityManager = entityManager;
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public void saveUser(UserEntity user) {
entityManager.persist(user);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public void saveUser(DumbEntity user) {
entityManager.persist(user);
}
@Override
public List<UserEntity> fetchAllUsers() {
String sql = "FROM UserEntity";
Query query = entityManager.createQuery(sql);
return query.getResultList();
}
@Override
public List<DumbEntity> fetchAllUsers2() {
String sql = "FROM DumbEntity";
Query query = entityManager.createQuery(sql);
return query.getResultList();
}
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
}
无论我是否使用fetchAllUsers()或fetchAllUsers2(),我都会得到结果,但我希望每一个都只适用于只具有特定实体知识的entityManager。
我希望你能分享一下你对这一点的想法。谢谢。