0

このスレッドで私に与えられた推奨事項に従う

DAO アクセサー @Singleton、@Startup、@LocalBean を作成しています

私の質問は、さまざまなクエリを実行することになっている entityManager を実装する良い方法です。

いくつかの Dao があることを知っていますが、それらはすべて同じ entityManager (これも単一の entityManagerFactory から作成されます) を指す必要があります。ベスト プラクティスは何ですか?

これはこれまでのところ私の実装ですが、非常に悪いと感じています:)

ダオズ

@Singleton
@LocalBean
@Startup
public class AircraftTypeDaoImpl extends DatabaseAccessor implements
        AircraftTypeDao {

    /** JPQL query to find a {@link AircraftType} given its OACI name */
    private static final String JPQL_FIND_BY_TYPE = "SELECT a FROM AircraftType a WHERE a.typeOACI=:typeOACI";

    /** JPQL query to find all {@link AircraftType} */
    private static final String JPQL_FIND_ALL = "SELECT a FROM AircraftType a";

    @Override
    public AircraftType find(String typeOACI) throws DAOException {
        AircraftType aircraftType = null;
        try {
            begin();
            Query findQuery = em.createQuery(JPQL_FIND_BY_TYPE).setParameter(
                    "typeOACI", typeOACI);
            aircraftType = (AircraftType) findQuery.getSingleResult();
        } catch (NoResultException e) {
            aircraftType = null;
            rollback();
        } catch (Exception e) {
            rollback();
            throw new DAOException(e);
        } finally {
            commit();
        }
        return aircraftType;
    }

    @Override
    public List<AircraftType> findAll() throws DAOException {
        List<AircraftType> types = null;
        try {
            begin();
            TypedQuery<AircraftType> findQuery = em.createQuery(JPQL_FIND_ALL,
                    AircraftType.class);
            types = findQuery.getResultList();
        } catch (NoResultException e) {
            types = new ArrayList<AircraftType>();
            rollback();
        } catch (Exception e) {
            rollback();
            throw new DAOException(e);
        } finally {
            commit();
        }
        return types;
    }

}

@Singleton
@LocalBean
@Startup
public class VariantDaoImpl extends DatabaseAccessor implements VariantDao {

    /** JPQL query to find a {@link Variant} given its variant name */
    private static final String JPQL_FIND_BY_NAME = "SELECT v FROM Variant v WHERE v.variantName=:variantName";

    /**
     * JPQL query to find all {@link Variant} given their associated
     * {@link AircraftType}
     */
    private static final String JPQL_FIND_BY_AC_TYPE = "SELECT v FROM Variant v WHERE v.type.typeOACI=:typeOACI";

    @Override
    public Variant find(String variantName) throws DAOException {
        Variant variant = null;
        try {
            begin();
            Query findQuery = em.createQuery(JPQL_FIND_BY_NAME).setParameter(
                    "variantName", variantName);
            variant = (Variant) findQuery.getSingleResult();
        } catch (NoResultException e) {
            variant = null;
            rollback();
        } catch (Exception e) {
            rollback();
            throw new DAOException(e);
        } finally {
            commit();
        }
        return variant;
    }

    @Override
    public List<Variant> find(AircraftType aircraftType) throws DAOException {
        List<Variant> variants = null;
        try {
            begin();
            TypedQuery<Variant> findQuery = em.createQuery(
                    JPQL_FIND_BY_AC_TYPE, Variant.class).setParameter(
                    "typeOACI", aircraftType.getTypeOACI());
            variants = findQuery.getResultList();
        } catch (NoResultException e) {
            variants = new ArrayList<Variant>();
            rollback();
        } catch (Exception e) {
            rollback();
            throw new DAOException(e);
        } finally {
            commit();
        }
        return variants;
    }

}

「マザークラス」

public abstract class DatabaseAccessor {

    protected EntityManager em;

    private EntityTransaction tx;

    public DatabaseAccessor() {
        em = Persistence.createEntityManagerFactory("database")
                .createEntityManager();
    }

    public void begin() {
        tx = em.getTransaction();
        tx.begin();
    }

    public void commit() {
        tx.commit();
    }

    public void rollback() {
        tx.rollback();
    }

}

編集

さて、私は混乱を単純化しました

私のすべてのDAOは今そのようになっています

@Singleton
@LocalBean
@Startup
public class AircraftTypeDaoImpl implements AircraftTypeDao {

    @PersistenceContext
    protected EntityManager em;

    /** JPQL query to find a {@link AircraftType} given its OACI name */
    private static final String JPQL_FIND_BY_TYPE = "SELECT a FROM AircraftType a WHERE a.typeOACI=:typeOACI";

    /** JPQL query to find all {@link AircraftType} */
    private static final String JPQL_FIND_ALL = "SELECT a FROM AircraftType a";

    @Override
    public AircraftType find(String typeOACI) throws DAOException {
        AircraftType aircraftType = null;
        try {
            Query findQuery = em.createQuery(JPQL_FIND_BY_TYPE).setParameter(
                    "typeOACI", typeOACI);
            aircraftType = (AircraftType) findQuery.getSingleResult();
        } catch (NoResultException e) {
            aircraftType = null;
        } catch (Exception e) {
            throw new DAOException(e);
        }
        return aircraftType;
    }

    @Override
    public List<AircraftType> findAll() throws DAOException {
        List<AircraftType> types = null;
        try {
            TypedQuery<AircraftType> findQuery = em.createQuery(JPQL_FIND_ALL,
                    AircraftType.class);
            types = findQuery.getResultList();
        } catch (NoResultException e) {
            types = new ArrayList<AircraftType>();
        } catch (Exception e) {
            throw new DAOException(e);
        }
        return types;
    }

}

私のpersistence.xmlはそのようなものです

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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_2_0.xsd">
    <persistence-unit name="flightfaq">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.archive.autodetection" value="class, hbm"/>
            <property name="hibernate.connection.username" value="root"/>
            <property name="hibernate.connection.password" value="password"/>
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/flightfaq"/>
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.c3p0.min_size" value="5"/>
            <property name="hibernate.c3p0.max_size" value="20"/>
            <property name="hibernate.c3p0.timeout" value="300"/>
            <property name="hibernate.c3p0.max_statements" value="50"/>
            <property name="hibernate.c3p0.idle_test_period" value="3000"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="use_sql_comments" value="true"/>
            <property name="jadira.usertype.autoRegisterUserTypes" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

TomEE にアプリをデプロイすると、

26 févr. 2013 21:01:41 org.apache.openejb.config.ConfigurationFactory configureApplication
INFO: Configuring enterprise application: /Users/valentine/jbossworkspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/FlightFAQ
26 févr. 2013 21:01:43 org.apache.openejb.config.InitEjbDeployments deploy
INFO: Auto-deploying ejb CustomerDaoImpl: EjbDeployment(deployment-id=CustomerDaoImpl)
26 févr. 2013 21:01:43 org.apache.openejb.config.InitEjbDeployments deploy
INFO: Auto-deploying ejb AircraftTypeDaoImpl: EjbDeployment(deployment-id=AircraftTypeDaoImpl)
26 févr. 2013 21:01:43 org.apache.openejb.config.InitEjbDeployments deploy
INFO: Auto-deploying ejb VariantDaoImpl: EjbDeployment(deployment-id=VariantDaoImpl)
26 févr. 2013 21:01:43 org.apache.openejb.config.InitEjbDeployments deploy
INFO: Auto-deploying ejb FlightFaqUserDaoImpl: EjbDeployment(deployment-id=FlightFaqUserDaoImpl)
26 févr. 2013 21:01:43 org.apache.openejb.config.InitEjbDeployments deploy
INFO: Auto-deploying ejb AirportDaoImpl: EjbDeployment(deployment-id=AirportDaoImpl)
26 févr. 2013 21:01:43 org.apache.openejb.config.InitEjbDeployments deploy
INFO: Auto-deploying ejb LegDaoImpl: EjbDeployment(deployment-id=LegDaoImpl)
26 févr. 2013 21:01:43 org.apache.openejb.config.InitEjbDeployments deploy
INFO: Auto-deploying ejb MissionDaoImpl: EjbDeployment(deployment-id=MissionDaoImpl)
26 févr. 2013 21:01:43 org.apache.openejb.config.AutoConfig deploy
INFO: Configuring PersistenceUnit(name=flightfaq, provider=org.hibernate.ejb.HibernatePersistence)
26 févr. 2013 21:01:43 org.apache.openejb.config.AutoConfig setJtaDataSource
INFO: Adjusting PersistenceUnit flightfaq <jta-data-source> to Resource ID 'My DataSource' from 'null'
26 févr. 2013 21:01:43 org.apache.openejb.config.AutoConfig setNonJtaDataSource
INFO: Adjusting PersistenceUnit flightfaq <non-jta-data-source> to Resource ID 'My Unmanaged DataSource' from 'null'
26 févr. 2013 21:01:43 org.apache.openejb.config.AppInfoBuilder build
INFO: Enterprise application "/Users/valentine/jbossworkspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/FlightFAQ" loaded.
26 févr. 2013 21:01:43 org.apache.openejb.assembler.classic.Assembler createApplication
INFO: Assembling app: /Users/valentine/jbossworkspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/FlightFAQ
26 févr. 2013 21:01:44 org.hibernate.annotations.common.Version <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.1.Final}
26 févr. 2013 21:01:44 org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.1.9.Final}
26 févr. 2013 21:01:44 org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
26 févr. 2013 21:01:44 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
26 févr. 2013 21:01:44 org.hibernate.ejb.Ejb3Configuration configure
INFO: HHH000204: Processing PersistenceUnitInfo [
    name: flightfaq
    ...]
26 févr. 2013 21:01:44 org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator instantiateExplicitConnectionProvider
INFO: HHH000130: Instantiating explicit connection provider: org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider
26 févr. 2013 21:02:05 com.sun.faces.mgbean.BeanManager addBean
ATTENTION: JSF1074 : Le bean géré nommé «startup» a déjà été enregistré.  Remplacement du type de classe du bean géré existant java.util.Date par java.util.Date.
26 févr. 2013 21:02:05 com.sun.faces.mgbean.BeanManager addBean
ATTENTION: JSF1074 : Le bean géré nommé «now» a déjà été enregistré.  Remplacement du type de classe du bean géré existant java.util.Date par java.util.Date.
26 févr. 2013 21:02:07 org.richfaces.application.InitializationListener logWarningWhenConnectionFactoryPresent
ATTENTION: JMS API was found on the classpath; if you want to enable RichFaces Push JMS integration, set context-param 'org.richfaces.push.jms.enabled' in web.xml
26 févr. 2013 21:02:07 org.apache.catalina.session.StandardManager doLoad
GRAVE: "ClassNotFoundException" lors du chargement de sessions persistantes: java.lang.ClassNotFoundException: com.flightfaq.dao.impl.AircraftTypeDaoImpl$LocalBeanProxy
java.lang.ClassNotFoundException: com.flightfaq.dao.impl.AircraftTypeDaoImpl$LocalBeanProxy
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
    at org.apache.tomee.catalina.LazyStopWebappClassLoader.loadClass(LazyStopWebappClassLoader.java:98)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:249)
    at org.apache.catalina.util.CustomObjectInputStream.resolveClass(CustomObjectInputStream.java:76)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1572)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1493)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1729)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1950)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1874)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1756)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
    at java.util.HashMap.readObject(HashMap.java:1030)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:969)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1852)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1756)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1950)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1874)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1756)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
    at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1664)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1320)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
    at java.util.HashMap.readObject(HashMap.java:1030)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:969)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1852)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1756)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
    at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1664)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1320)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
    at java.util.HashMap.readObject(HashMap.java:1030)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:969)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1852)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1756)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
    at java.util.HashMap.readObject(HashMap.java:1030)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:969)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1852)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1756)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
    at org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1595)
    at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1060)
    at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:284)
    at org.apache.catalina.session.StandardManager.load(StandardManager.java:204)
    at org.apache.catalina.session.StandardManager.startInternal(StandardManager.java:491)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5294)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:680)
26 févr. 2013 21:02:07 org.apache.catalina.session.StandardManager startInternal
GRAVE: Exception au chargement des sessions depuis le stockage persistant (persistent storage)
java.lang.ClassNotFoundException: com.flightfaq.dao.impl.AircraftTypeDaoImpl$LocalBeanProxy
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
    at org.apache.tomee.catalina.LazyStopWebappClassLoader.loadClass(LazyStopWebappClassLoader.java:98)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:249)
    at org.apache.catalina.util.CustomObjectInputStream.resolveClass(CustomObjectInputStream.java:76)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1572)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1493)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1729)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1950)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1874)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1756)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
    at java.util.HashMap.readObject(HashMap.java:1030)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:969)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1852)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1756)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1950)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1874)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1756)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
    at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1664)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1320)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
    at java.util.HashMap.readObject(HashMap.java:1030)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:969)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1852)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1756)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
    at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1664)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1320)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
    at java.util.HashMap.readObject(HashMap.java:1030)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:969)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1852)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1756)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
    at java.util.HashMap.readObject(HashMap.java:1030)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:969)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1852)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1756)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
    at org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1595)
    at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1060)
    at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:284)
    at org.apache.catalina.session.StandardManager.load(StandardManager.java:204)
    at org.apache.catalina.session.StandardManager.startInternal(StandardManager.java:491)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5294)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:680)

さまざまなDAOが正しくデプロイされているようですが、私のDaoのLocalProxyバージョンにクラスが見つからないという例外がありますか? 説明していただけますか?ウェブサーバーに問題はありますか? その種の操作(@PersistenceContextなど)と互換性があるかどうかを確認するにはどうすればよいですか

4

1 に答える 1

1

これは、JTA トランザクションとコンテナー管理の永続コンテキストを使用してすぐに使用できるものの自己ロール部分実装のように見えます。

さらに、このコンテキストでデフォルトの同時実行性 (コンテナ管理、WRITE) でシングルトンを使用すると、メソッドの同時実行が制限されるため、重大なパフォーマンス ヒットが発生する可能性があります。データベース クエリには比較的長い時間がかかる場合があり、一度に 1 つのみを実行する理由はおそらくありません。EJB 3.1仕様で述べられているように:

デフォルトでは、同時実行管理タイプが指定されていない場合、シングルトン Bean にはコンテナ管理の同時実行境界があります。
...
同時ロック属性が指定されていない場合は、Lock(WRITE) と見なされます。Bean クラスに同時実行属性を指定しないことは、Bean クラスに Lock(WRITE) を指定することと同じです。
...
コンテナーが書き込みロックに関連付けられたメソッドを呼び出す場合、最初の書き込みメソッドの処理が完了するまで、他の同時呼び出しは続行できません。

コンテナー管理の EntityManager を使用しない特別な理由がない場合、次のJava EE 6 チュートリアルからの抜粋で、コンテナー管理の EntityManager を使用して EntityManagerの単一インスタンスを渡す必要がない理由を説明しています。

通常、JTA トランザクションには、アプリケーション コンポーネント間の呼び出しが含まれます。JTA トランザクションを完了するために、これらのコンポーネントは通常、単一の永続化コンテキストにアクセスする必要があります。これは、javax.persistence.PersistenceContext アノテーションを使用して EntityManager がアプリケーション コンポーネントに注入されたときに発生します。永続コンテキストは現在の JTA トランザクションで自動的に伝播され、同じ永続ユニットにマップされた EntityManager 参照は、そのトランザクション内の永続コンテキストへのアクセスを提供します。永続化コンテキストを自動的に伝播することにより、アプリケーション コンポーネントは、単一のトランザクション内で変更を行うために、EntityManager インスタンスへの参照を相互に渡す必要がなくなります。Java EE コンテナは、コンテナ管理のエンティティ マネージャのライフサイクルを管理します。

于 2013-02-26T19:08:46.640 に答える