Hibernate + Spring两个持久性单元具有自己的实体子集

时间:2012-09-23 10:10:04

标签: spring hibernate

我是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。

我希望你能分享一下你对这一点的想法。谢谢。

0 个答案:

没有答案