2

我是 Spring 的新手,但总的来说我知道它的功能,所以我决定在我的一个项目中使用它。然而,主要问题在于 Hibernate。在引入spring这个想法之前,前提是:

我的应用程序(不是网络)必须连接到数据库并使用“persistence_1.xml”和它自己的一组实体类从它收集信息。换句话说,与“persistence_1.xml”相关的所有内容都是只读的,因此不会发生悲剧。名称为“p1”的持久性单元的“persistence_1.xml”也来自网络应用程序依赖项。所以图片是这样的:我的应用程序(非网络)在 maven 的支持下编写,获取其他应用程序的依赖项来访问数据库并收集信息。

另一个持久性单元名称为“p2”的“persistence_2.xml”和它自己的实体子集是由我创建的,用于将收集和处理的信息存储到同一个数据库中。

所以最初我有两个实体经理一个负责“p1”另一个负责“p2”。

我在互联网上看到了一些材料,其中展示了如何使用不同的数据源配置两个实体管理器,但我不知道如何在 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 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 一起使用。

我希望你分享你对这个的想法。谢谢你。

4

0 回答 0