2013-02-26 86 views
0

以下建議在this thread管理數據庫實體管理器給我

我讓我的DAO訪問器@Singleton,@Startup的好辦法,@LocalBean

我的問題是關於實現了EntityManager的好辦法應該執行各種查詢。

知道有幾個道的,但他們應都指向相同的EntityManager(也由單一的entityManagerFactory創建的),什麼是最好的做法是什麼?

這是迄今爲止我的實現,但我有一種感覺,這是reeeeealy壞:)

道的

@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等等)

回答

1

它看起來有點像JTA事務和容器管理的持久化上下文開箱即用的自動部分實現。

此外,使用默認併發性(容器管理,WRITE)的Singleton也會導致嚴重的性能下降,因爲它限制了方法的併發執行。數據庫查詢可能需要相當長的時間,並且可能沒有理由在一次只執行其中的一個。正如在EJB 3.1規範說:

默認情況下,如果未指定併發管理類型是單豆已經容器管理的併發 劃分。
...
如果未指定併發鎖定屬性,則假定 是鎖定(寫)。 bean類上的併發屬性 規範的缺失等同於Bean類上的鎖定(WRITE)規範 。
...
如果容器調用與Write鎖相關的方法,則其他併發調用將被允許繼續,直到 初始Write方法的處理完成。

如果沒有不使用容器管理的EntityManager,從Java EE 6 Tutorial以下摘錄具體原因可以解釋爲什麼沒有必要通過的EntityManager的單個實例和容器管理的EntityManager各地:

JTA事務通常涉及跨應用程序組件的調用 要完成JTA事務,這些組件通常需要訪問單個持久性上下文的 。當EntityManager通過 javax.persistence.PersistenceContext註釋注入到應用程序組件中時,會發生這種情況。使用當前JTA事務 自動傳播持久性 上下文,並且映射到相同持久性的EntityManager引用提供對該事務中的持久性上下文的訪問。通過自動傳播持久化上下文,應用程序組件不需要將對EntityManager實例的引用傳遞給對方,以便在單個事務中進行更改。 Java EE容器管理容器管理實體管理器的生命週期。

+0

我編輯了我的答案和變化 – facewindu 2013-02-26 20:52:34

+0

我想指出,隨着EDIT中描述的變化,實體管理器不能像以前那樣執行查詢。一個簡單的查詢,如「SELECT a FROM AircraftType a」返回一個空列表 – facewindu 2013-02-26 21:28:48

+0

我正在關閉此線程,因爲它現在不可重現。我不知道發生了什麼事。但我創建了[這個線程](http://stackoverflow.com/questions/15106627/persistencecontext-makes-queries-empty),因爲現在查詢都是空的。 – facewindu 2013-02-27 07:45:28