2

私はSpringを初めて使用しますが、一般的にその機能を認識しているため、プロジェクトの1つで使用することにしました. ただし、主な問題は Hibernate にあります。春を導入するというこのアイデアの前に、前提は次のとおりです。

私のアプリケーション (Web ではない) は、DB に接続し、独自のエンティティ クラスのセットを持つ "persistence_1.xml" を使用して DB から情報を収集する必要がありました。つまり、「persistence_1.xml」に関連するものはすべて読み取り専用で、悲劇が発生しないようになっていました。また、"p1" という名前の永続ユニットを持つ "persistence_1.xml" は、Web アプリの依存関係に由来します。だから写真はこれです:私のアプリ(ウェブではない)はmavenのサポートで書かれ、データベースにアクセスして情報を収集するために他のアプリケーションの依存関係を取りました。

もう 1 つの「persistence_2.xml」は、persistence-unit 名が「p2」であり、エンティティの独自のサブセットは、収集および処理された情報を同じデータベースに格納するために作成されました。

そのため、もともと「p1」を担当するエンティティマネージャーと「p2」を担当するエンティティマネージャーが2人いました。

異なるデータ ソースを持つ 2 つのエンティティ マネージャーを構成する方法を示すインターネット上の資料を見たことがありますが、独自のエンティティ セットを使用して SPRING で 2 つのエンティティ マネージャーを作成する方法がわかりません。

「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