0

JPAを使用したい単純なWebアプリケーションを構築しています。私は Glassfish にデプロイすることを期待していますが、JTA データソースではなく、アプリケーション内でエンティティの永続性を管理する方が有益であると考えていました。これは非常に明るいアイデアではないかもしれないことを認めますか?

しばらく前に、以下をまとめました (おそらく、失われた Web 参照から)。

public class PersistenceManager {
    private static final PersistenceManager instance = new PersistenceManager();
    protected EntityManagerFactory emf;

    public static PersistenceManager getInstance() {
        return instance;
    }

    private PersistenceManager() {
    }

    public EntityManagerFactory getEntityManagerFactory() {
        if (emf == null) {
            createEntityManagerFactory();
        }
        return emf;
    }

    public void closeEntityManagerFactory() {
        if (emf != null) {
            emf.close();
            emf = null;
        }
    }

    protected void createEntityManagerFactory() {
        this.emf = Persistence.createEntityManagerFactory("Met");
    }
}

それで、私の質問です。これは合理的なアプローチですか?ここに落とし穴はありますか?

4

2 に答える 2

1

私は常にコンテナー管理の永続性なしで JPA をデプロイしてきました。Atomikos JTA トランザクション マネージャーでも使用しました。最も簡単な方法は、JNDI ベースのルックアップを使用しないことです。Spring の JPATransactionManager を使用し、すべてを persistence.xml または spring-xml で構成することをお勧めします。

Spring-xml の持続性マネージャー:

<bean id="pum" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
    <property name="defaultDataSource" ref="dataSource" />
    <property name="persistenceXmlLocations">
        <list>
            <value>classpath:META-INF/etf-persistence.xml</value>
        </list>
    </property>
</bean>

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitManager" ref="pum" />
    <property name="persistenceUnitName" value="my-pu" />
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.ejb.cfgfile">my-hibernate.cfg.xml</prop>

            <prop key="hibernate.session_factory_name">mySessionFactory</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
            <prop key="hibernate.archive.autodetection">none</prop>

            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.format_sql">false</prop>       
    </property>
</bean>

persistence.xml で non-jta または jta-data-source タグを指定しないでください。残りのセットアップは標準的な春です (EntityManagerFactory、DataSource など)。

于 2013-02-06T02:11:23.243 に答える
0

これは確かに最善のアイデアではありません。@BalusC が指摘したように、独自の TX 管理配管をすべて引き継いで、すべてを手動で作成し、開始および終了する必要があります。大量の定型コードがあり、バグが発生する可能性があり、それから何の利益も得られません。

JTA を自分で追加することによって提供しない簡素化されたサーブレット コンテナーにいる場合でも、JTA を使用できます。すべて無料で。

さらに言えば、Glassfish Web プロファイルを選択しても (完全なプラットフォームに対して) 使用できます。

于 2013-02-08T05:24:19.113 に答える