管理数据库实体管理器的好方法 [英] Good way of managing database entity manager

查看:239
本文介绍了管理数据库实体管理器的好方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此线程中向我发送以下建议


$ b $我正在制作我的DAO访问器@Singleton,@Startup,@LocalBean



我的问题是实现应该执行的entityManager的好方法各种查询。



知道有几个Dao,但他们都指向同一个entityManager(也是从一个entityManagerFactory创建的),最好的做法是什么? p>

这是迄今为止我的实现,但我有一种感觉,它是reeeeealy坏:)



Dao的



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

/ ** JPQL查询给出了它的OACI名称* /
private static final String JPQL_FIND_BY_TYPE =SELECT a FROM Ai rcraftType a WHERE a.typeOACI =:typeOACI;

/ ** JPQL查询查找全部{@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();
查询findQuery = em.createQuery(JPQL_FIND_BY_TYPE).setParameter(
typeOACI,typeOACI);
aircraftType =(AircraftType)findQuery.getSingleResult();
} catch(NoResultException e){
aircraftType = null;
rollback();
} catch(Exception e){
rollback();
抛出新的DAOException(e);
} finally {
commit();
}
返回飞机类型;
}

@Override
public List< AircraftType> findAll()throws DAOException {
列表< 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();
抛出新的DAOException(e);
} finally {
commit();
}
返回类型;
}

}

@Singleton
@LocalBean
@Startup
public class VariantDaoImpl extends DatabaseAccessor实现VariantDao {

/ ** JPQL查询找到一个{@link Variant},其变体名称为* /
private static final String JPQL_FIND_BY_NAME =SELECT v FROM Variant v WHERE v.variantName =:variantName;

/ **
* JPQL查询查找所有{@link Variant}给定相关联的
* {@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();
查询findQuery = em.createQuery(JPQL_FIND_BY_NAME).setParameter(
variantName,variantName);
variant =(Variant)findQuery.getSingleResult();
} catch(NoResultException e){
variant = null;
rollback();
} catch(Exception e){
rollback();
抛出新的DAOException(e);
} finally {
commit();
}
返回变体;
}

@Override
public List< Variant> find(AircraftType aircraftType)throws DAOException {
List< Variant> variant = 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){
variant = new ArrayList< Variant>();
rollback();
} catch(Exception e){
rollback();
抛出新的DAOException(e);
} finally {
commit();
}
返回变体;
}

}

母亲类

  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();
}

}

编辑



好吧,我简化了这个乱七八糟

ALl我的DAO现在是这样的

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

@PersistenceContext
protected实体管理器

/ ** JPQL查询找到一个{@link AircraftType}给定其OACI名称* /
private static final String JPQL_FIND_BY_TYPE =SELECT a FROM AircraftType a WHERE a.typeOACI =:typeOACI ;

/ ** JPQL查询查找全部{@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;
尝试{
查询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);
}
返回飞机类型;
}

@Override
public List< AircraftType> findAll()throws DAOException {
列表< AircraftType> types = null;
尝试{
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);
}
返回类型;
}

}

我的persistence.xml就是这样

 <?xml version =1.0encoding =UTF-8?> 
< persistence version =2.0xmlns =http://java.sun.com/xml/ns/persistencexmlns:xsi =http://www.w3.org/2001/XMLSchema-实例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>
<属性>
< property name =hibernate.archive.autodetectionvalue =class,hbm/>
< property name =hibernate.connection.usernamevalue =root/>
< property name =hibernate.connection.passwordvalue =password/>
< property name =hibernate.connection.urlvalue =jdbc:mysql:// localhost:3306 / flightfaq/>
< property name =hibernate.connection.driver_classvalue =com.mysql.jdbc.Driver/>
< property name =hibernate.hbm2ddl.autovalue =update/>
< property name =hibernate.c3p0.min_sizevalue =5/>
< property name =hibernate.c3p0.max_sizevalue =20/>
< property name =hibernate.c3p0.timeoutvalue =300/>
< property name =hibernate.c3p0.max_statementsvalue =50/>
< property name =hibernate.c3p0.idle_test_periodvalue =3000/>
< property name =hibernate.show_sqlvalue =true/>
< property name =hibernate.format_sqlvalue =true/>
< property name =use_sql_commentsvalue =true/>
< property name =jadira.usertype.autoRegisterUserTypesvalue =true/>
< / properties>
< / persistence-unit>
< / persistence>

在TomEE上部署应用程序时,我得到

  26févr。 2013 21:01:41 org.apache.openejb.config.ConfigurationFactory configureApplication 
INFO:配置企业应用程序:/Users/valentine/jbossworkspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0 / wtpwebapps / FlightFAQ
26févr。 2013 21:01:43 org.apache.openejb.config.InitEjbDeployments deploy
INFO:自动部署ejb CustomerDaoImpl:EjbDeployment(deployment-id = CustomerDaoImpl)
26févr。 2013 21:01:43 org.apache.openejb.config.InitEjbDeployments deploy
INFO:自动部署ejb AircraftTypeDaoImpl:EjbDeployment(deployment-id = AircraftTypeDaoImpl)
26févr。 2013 21:01:43 org.apache.openejb.config.InitEjbDeployments deploy
INFO:自动部署ejb VariantDaoImpl:EjbDeployment(deployment-id = VariantDaoImpl)
26févr。 2013 21:01:43 org.apache.openejb.config.InitEjbDeployments deploy
INFO:自动部署ejb FlightFaqUserDaoImpl:EjbDeployment(deployment-id = FlightFaqUserDaoImpl)
26févr。 2013 21:01:43 org.apache.openejb.config.InitEjbDeployments deploy
INFO:自动部署ejb AirportDaoImpl:EjbDeployment(deployment-id = AirportDaoImpl)
26févr。 2013 21:01:43 org.apache.openejb.config.InitEjbDeployments deploy
INFO:自动部署ejb LegDaoImpl:EjbDeployment(deployment-id = LegDaoImpl)
26févr。 2013 21:01:43 org.apache.openejb.config.InitEjbDeployments deploy
INFO:自动部署ejb MissionDaoImpl:EjbDeployment(deployment-id = MissionDaoImpl)
26févr。 2013 21:01:43 org.apache.openejb.config.AutoConfig deploy
INFO:配置PersistenceUnit(name = flightfaq,provider = org.hibernate.ejb.HibernatePersistence)
26févr。 2013 21:01:43 org.apache.openejb.config.AutoConfig setJtaDataSource
INFO:调整PersistenceUnit flightfaq< jta-data-source>到资源ID'我的数据源'从'null'
26févr。 2013 21:01:43 org.apache.openejb.config.AutoConfig setNonJtaDataSource
INFO:调整PersistenceUnit flightfaq< non-jta-data-source>从null到资源ID我的非托管数据源
26févr。 2013 21:01:43 org.apache.openejb.config.AppInfoBuilder build
INFO:企业应用程序/Users/valentine/jbossworkspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/ wtpwebapps / FlightFAQ加载。
26fé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
26févr。 2013 21:01:44 org.hibernate.annotations.common.Version< clinit>
信息:HCANN000001:Hibernate Commons注释{4.0.1.Final}
26févr。 2013 21:01:44 org.hibernate.Version logVersion
INFO:HHH000412:Hibernate Core {4.1.9.Final}
26févr。 2013 21:01:44 org.hibernate.cfg.Environment< clinit>
信息:HHH000206:没有找到hibernate.properties
26févr。 2013 21:01:44 org.hibernate.cfg.Environment buildBytecodeProvider
INFO:HHH000021:Bytecode提供者名称:javassist
26févr。 2013 21:01:44 org.hibernate.ejb.Ejb3Configuration configure
INFO:HHH000204:Processing PersistenceUnitInfo [
name:flightfaq
...]
26févr。 2013 21:01:44 org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator instantiateExplicitConnectionProvider
INFO:HHH000130:实例化显式连接提供程序:org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider
26févr。 2013 21:02:05 com.sun.faces.mgbean.BeanManager addBean
注意:JSF1074:Le beangérénommé«启动»adéjàétéenregistré。 Remplacement du type de classe du beangéréexistsant java.util.Date par java.util.Date。
26févr。 2013 21:02:05 com.sun.faces.mgbean.BeanManager addBean
注意:JSF1074:Le beangérénommé«now»adéjàétéenregistré。 Remplacement du type de classe du beangéréexistsant java.util.Date par java.util.Date。
26févr。 2013 21:02:07 org.richfaces.application.InitializationListener logWarningWhenConnectionFactoryPresent
注意:在类路径中找到JMS API;如果要启用RichFaces Push JMS集成,请在web.xml
26févr中设置上下文参数org.richfaces.push.jms.enabled。 2013 21:02:07 org.apache.catalina.session.StandardManager doLoad
GRAVE:ClassNotFoundExceptionlors du chargement de sessions persistantes:java.lang.ClassNotFoundException:com.flightfaq.dao.impl.AircraftTypeDaoImpl $ LocalBeanProxy
java.lang.ClassNotFoundException:com.flightfaq.dao.impl.AircraftTypeDaoImpl $ LocalBeanProxy
在org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
在org。 Apache java.lang.Class上的
() forName0(Native Method)
在java.lang.Class.forName(Class.java:249)
在org.apache.catalina.util.CustomObjectInputStream.resolveClass(CustomObjectInputStream.java:76)
java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1572)
在java.io.ObjectInputStream.readClassDesc(ObjectInputStrea m.java:1493)
在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1729)
在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
在java .io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1950)
在java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1874)
在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1756 )
在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
在java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
在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)
在java.lang.reflect.Method.invoke(Method.java:597)
在java.io.ObjectStream (java.io.ObjectInputStream.readSerialData $ b在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
在java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1950)
在java.io.ObjectInputStream.readSerialData(ObjectInputStream .java:1874)
在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1756)
在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
在java。 io.ObjectInputStream.readArray(ObjectInputStream.java:1664)
在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1320)
在java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
在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)
在java.lang.reflect.Method.invoke(方法.java:597)
在java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:969)
在java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1852)
在java。 io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1756)
在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
在java.io.ObjectInputStream.readArray(ObjectInputStream.java:1664)
在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1320)
在java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
在java.util.HashMap.readObject (HashMap.java:1030)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Nativ eMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
在java.lang.reflect.Method.invoke(Method.java:597)
在java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:969)
在java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1852)
在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java :1756)
在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
在java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
在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)
在java.lang.reflect.Method.invoke(Method.java:597)
在java.io.Obje ctStreamClass.invokeReadObject(ObjectStreamClass.java:969)
在java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1852)
在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1756)
在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
在java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
在org.apache.catalina.session.StandardSession .readObject(StandardSession.java:1595)
在org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1060)
在org.apache.catalina.session.StandardManager.doLoad(StandardManager .java:284)
在org.apache.catalina.session.StandardManager.load(StandardManager.java:204)
在org.apache.catalina.session.StandardManager.startInternal(StandardManager.java:491 )
在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
在org.apache.catalina.core.StandardContext.startInternal(Stand ardContext.java:5294)
在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
在org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase。 java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java: 303)
在java.util.concurrent.FutureTask.run(FutureTask.java:138)
在java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:895)
在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:918)
在java.lang.Thread.run(Thread.java:680)
26févr。 2013 21:02:07 org.apache.catalina.session.StandardManager startInternal
GRAVE:异常处理持久化(持久存储)
java.lang.ClassNotFoundException:com.flightfaq.dao .impl.AircraftTypeDaoImpl $ LocalBeanProxy
在org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
在org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java: 1559)
在org.apache.tomee.catalina.LazyStopWebappClassLoader.loadClass(LazyStopWebappClassLoader.java:98)
在java.lang.Class.forName0(本机方法)
在java.lang。 Class.forName(Class.java:249)
在org.apache.catalina.util.CustomObjectInputStream.resolveClass(CustomObjectInputStream.java:76)
在java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java: 1572)
在java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1493)
在java.io.ObjectInputStream.readOrdinaryObje ct(ObjectInputStream.java:1729)
在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
在java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1950)
在java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1874)
在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1756)
在java.io.ObjectInputStream.readObject0(ObjectInputStream.java :1326)
在java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
在java.util.HashMap.readObject(HashMap.java:1030)
在sun.reflect。 NativeMethodAttributeImpl.invoke0 java.lang.reflect.Method.invoke(Method.java:597)
在java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:969)
在java .io.ObjectInputStream.readSerialData(ObjectInputStream.java:1852)
在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1756)
在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326 )
在java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1950)
在java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1874)
在java.io.ObjectInputStream。 readOrdinaryObject(ObjectInputStream.java:1756)
在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
在java.io.ObjectInputStream.readArray(ObjectInputStream.java:1664)
在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1320)
在java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
在java.util.HashMap.readObject(HashMap.java :1030)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcce ssorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
在java.lang.reflect.Method.invoke(Method.java:597)
在java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:969)
在java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1852)
在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java :1756)
在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1326)
在java.io.ObjectInputStream.readArray(ObjectInputStream.java:1664)
在java.io. ObjectInputStream.readObject0(ObjectInputStream.java:1320)
在java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
在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.DelegatingMeth odAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
在java.lang.reflect.Method.invoke(Method.java:597)
在java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:969)
在java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1852)
在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1756)
在java.io.ObjectInputStream.readObject0 (ObjectInputStream.java:1326)
在java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
在java.util.HashMap.readObject(HashMap.java:1030)
在sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
在java.lang.reflect.Method.invoke(Method.java:597)
在java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:969)
在java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1852)
在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1756)
在java.io.ObjectInputStream.readObject0(ObjectInputStream.java :1326)
在java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
在org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1595)
在org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1060)
在org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:284)
在org.apache。 catalina.session.StandardManager.load(StandardManager.java:204)
在org.apache.catalina.session.StandardManager.startInternal(StandardManager.java:491)
在org.apache.catalina.util。 LifecycleBase.start(LifecycleBase.java:150)
在org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5294)
在org.apache.catalina.util.Lifecycl eBase.start(LifecycleBase.java:150)
在org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1559)
在org.apache.catalina.core.ContainerBase $ StartChild.call(ContainerBase.java:1549)
在java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:303)
在java.util.concurrent.FutureTask.run(FutureTask。 java:138)
在java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:895)
在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:918)
在java.lang.Thread.run(Thread.java:680)

各种DAO的部署正确,但是在我的Dao的LocalProxy版本中有一个类没有找到异常?你可以解释一下吗?
网络服务器有问题吗?如何检查是否与这种操作兼容(@PersistenceContext等)

解决方案

看起来有点像自动部分实现与JTA事务和容器管理的持久性上下文一起出现的东西。



另外使用也可能导致严重的性能命中,因为它限制了方法的并发执行。数据库查询可能需要相当长的时间,很可能没有理由在时间上执行其中一个。如EJB 3.1规范中所述:


默认情况下,如果并发管理类型,单例bean具有容器管理并发
分界没有指定。

...

如果未指定并发锁定属性,则假定
为Lock(WRITE)。在bean类上没有并发属性
规范相当于bean类上的
锁(WRITE)的规范。

...

如果容器调用与写锁相关联的方法,则$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $

如果没有特定的理由不使用容器管理的EntityManager,请从 Java EE 6教程解释了为什么不需要使用容器管理的EntityManager传递EntityManager的单个实例:


JTA事务通常涉及跨应用程序组件的调用。
要完成JTA事务,这些组件通常需要访问
一个持久性上下文。当EntityManager通过
javax.persistence.PersistenceContext注释将
注入到应用程序组件中时,会发生这种情况。持久性
上下文将自动传播与当前的JTA事务,
和映射到相同持久性的$ EntityManager引用
单元提供访问该
事务中的持久性上下文。通过自动传播持久性上下文,
应用程序组件不需要将EntityManager
实例的引用传递给彼此,以便在单个
事务中进行更改。 Java EE容器管理
容器管理的实体管理器的生命周期。



Following recommendations given to me in this thread

I am making my DAO accessors @Singleton, @Startup, @LocalBean

My question is on the good way to implement the entityManager that is supposed to execute the various queries.

Knowing that there are several Dao's, but they shall all point to the same entityManager (also created from a single entityManagerFactory), what's the best practice ?

This is so far my implementation, but I have a feeling that it is reeeeealy bad :)

Dao's

@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;
    }

}

"mother class"

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();
    }

}

EDIT

Okay, I simplified the mess

ALl my DAO's are now like that

@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;
    }

}

My persistence.xml is like that

<?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>

When deploying the App on TomEE, I get

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)

It seems that the various DAO's a deploying correctly, but then there is a class not found exception on the LocalProxy version of my Dao ? Could you explain ? Is there a problem on the webserver ? How can I check if it is compatible with that kind of manipulation (@PersistenceContext, etc etc)

解决方案

It looks a bit like self rolled partial implementation of something that comes out of the box with JTA transactions and container managed persistence context.

Additionally using Singleton with default concurrency (container managed, WRITE) in this context can also cause serious performance hit, because it limits concurrent execution of methods. Database queries can take relatively long time, and likely there is no reason to execute only one of them at time. As said in the EJB 3.1 specification:

By default, a singleton bean has container managed concurrency demarcation if the concurrency management type is not specified.
...
If the concurrency locking attribute is not specified, it is assumed to be Lock(WRITE). The absence of a concurrency attribute specification on the bean class is equivalent to the specification of Lock(WRITE)on the bean class.
...
If the container invokes a method associated with a Write lock, no other concurrent invocations will be allowed to proceed until the initial Write method’s processing completes.

If there is no specific reason to not to use container managed EntityManager, following excerpt from the Java EE 6 Tutorial explains why there is no need to pass single instance of EntityManager around with container managed EntityManager:

JTA transactions usually involve calls across application components. To complete a JTA transaction, these components usually need access to a single persistence context. This occurs when an EntityManager is injected into the application components by means of the javax.persistence.PersistenceContext annotation. The persistence context is automatically propagated with the current JTA transaction, and EntityManager references that are mapped to the same persistence unit provide access to the persistence context within that transaction. By automatically propagating the persistence context, application components don’t need to pass references to EntityManager instances to each other in order to make changes within a single transaction. The Java EE container manages the lifecycle of container-managed entity managers.

这篇关于管理数据库实体管理器的好方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆