私は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 でのみ機能することを望みます。
この点について、ご意見をお聞かせいただければ幸いです。ありがとうございました。