春と自動休止トランザクション管理?
-
09-09-2019 - |
質問
どこまで春のフレームワークは、トランザクション処理に行くのですか?著書「アクションで春」あなたはXMLでセッション工場と取引テンプレートを設定して、あなたのDAOにそれらを配線することで、かなり簡単にSessionとトランザクション管理を心配しないでくださいDAOのメソッドを作成し、その例と提案の私の読書。 SpringSource.orgのドキュメントは、他の一方で、XMLおよび/または注釈の必要トンはこれを実現するためにことを示唆しています。
私は
の線に沿ってコードを取ることができます最も簡単な方法は何かここでの真実は、何ですかget session from sessionfactory
open transaction
preform database actions
commit transaction with error handling
と作るそれだけ
preform database actions
私は最低限に私の方法を越えていボイラープレートトランザクションコードの量を減らす?
解決
スプリングは、トランザクション境界の少なくとも3つの方法を提供する:
TransactionTemplate又はPlatformTransactionManagerを介して1)プログラムによる取り扱い、 - 設定上の光が、侵襲性
2)XMLを介して宣言 - 冗長XMLが、非侵襲的
3)アノテーションを介して宣言 - 光XMLでなく、侵襲性
あなたは選ぶどちらがあなたのニーズに最も適した1に依存して、春はあなたのためにその選択をすることはありません。注釈アプローチは、あなたが後にしているものであるように、あなたの質問から、それが鳴ります。
私は春のリファレンスマニュアル、注釈駆動型のトランザクション処理のセクションを読むことをお勧めします。これは、明確かつ簡潔です。
私はいつも最初のREFのドキュメントを参照してください、そして、それはドキュメントにない場合のみ、本を相談します。
他のヒント
がありますが、まさにそれを行うことができるように行うことになっているいくつかの作業ですが、それはあまりすべてではありません。たぶん、あなたはJPAは、例えば、独自のプロバイダを選ぶと一緒に使用します休止状態。そして、あなたはMETA-INFフォルダ内の永続ユニットを定義するpersistence.xmlのを配置する必要があります:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="YourDatabasePersistenceUnitName" transaction-type="RESOURCE_LOCAL"/>
</persistence>
次は、最低でも、それはこれらが含まれている必要があり、あなたが使用してSpringアプリケーションのコンテキストでデータベース接続のために必要なすべてのものを定義します:
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>/WEB-INF/jdbc.properties</value>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" scope="singleton">
<property name="driverClassName" value="org.postgresql.Driver"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="YourDatabasePersistenceUnitName"/>
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="POSTGRESQL" />
<property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="showSql" value="true"/>
<property name="generateDdl" value="false"/>
</bean>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
上記の一部のプロパティは、ニーズに応じて変更または追加することができます。あなたが推測していることなどの例では、HibernateでJPAとPostgreSQLデータベースのためです。
今、あなたは、単にこのようなあなたのデータ・アクセス・メソッドを定義することができます:
@Repository
@Transactional
public class UserJpaDAO {
protected EntityManager entityManager;
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
public void save(User theUser) {
entityManager.persist(theUser);
}
public User update(User theUser) {
return entityManager.merge(theUser);
}
}
ここで、ユーザは、アプリケーションによって定義されたJPAエンティティです。実際に私はそれを行うそのように - - あなたはあなたのDAOを呼び出すマネージャ/コントローラ層でマネージャー取引をかもしれませんが、私はあまり例を乱雑にしないように、ここでそれを一緒に置きます。
あなたは私の例の代わりにまっすぐに行くことをお勧めします。ニースの参照があります http://icoloma.blogspot.com/2006/11 /jpa-and-spring-fucking-cooltm_26.htmlする トップ3のリンクも参照は、同様に行く価値があります。