EJB NoSuchEJBException Zugriff auf Entity

  • Themenstarter Themenstarter Gast2
  • Beginndatum Beginndatum
G

Gast2

Gast
Hallo zusammen,

ich bekomme eine Exception wenn ich in meinem DAO auf den EntityManager zugreife.
Ich benutze als DI Framework, das CDI und EJB3.0
Java:
@Stateful
public class MyDaoImpl implements MyDao{

	@PersistenceContext(type=PersistenceContextType.EXTENDED)
	private EntityManager entityManager;
	
	@Override
	public MyEntity findMyEntityById(long id) {
		return entityManager.find(MyEntity .class, id);
	}
	
}

Java:
Caused by: javax.ejb.NoSuchEJBException: Could not find stateful bean: a3b3o6g-dq45hs-gmqdhiot-1-gmqds9hv-dm
	at org.jboss.ejb3.cache.simple.SimpleStatefulCache.get(SimpleStatefulCache.java:494) [:1.7.17]
	at org.jboss.ejb3.cache.simple.SimpleStatefulCache.get(SimpleStatefulCache.java:445) [:1.7.17]
	at org.jboss.ejb3.cache.simple.SimpleStatefulCache.remove(SimpleStatefulCache.java:557) [:1.7.17]
	at org.jboss.ejb3.stateful.StatefulContainer.destroySession(StatefulContainer.java:1353) [:1.7.17]
	at org.jboss.ejb3.endpoint.deployers.impl.EndpointImpl.destroySession(EndpointImpl.java:61) [:0.1.4]
	at org.jboss.weld.integration.ejb.JBossSessionObjectReference.remove(JBossSessionObjectReference.java:81) [:6.0.0.Final]
	at org.jboss.weld.bean.proxy.EnterpriseBeanProxyMethodHandler.invoke(EnterpriseBeanProxyMethodHandler.java:107) [:6.0.0.Final]
	at org.jboss.weld.bean.proxy.EnterpriseTargetBeanInstance.invoke(EnterpriseTargetBeanInstance.java:62) [:6.0.0.Final]
	at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:125) [:6.0.0.Final]
	at com.enbw.pricepilot.basis.service.org$jboss$weld$bean-jboss$classloader:id="vfs:$$$D:$JBoss$jboss-6$0$0$Final$server$default$deploy$xPP_Prototyp$war"-SessionBean-BuendelstelleDAO_$$_WeldProxy.destroy(org$jboss$weld$bean-jboss$classloader:id="vfs:$$$D:$JBoss$jboss-6$0$0$Final$server$default$deploy$xPP_Prototyp$war"-SessionBean-BuendelstelleDAO_$$_WeldProxy.java)
	at org.jboss.weld.bean.SessionBean.destroy(SessionBean.java:384) [:6.0.0.Final]
	at org.jboss.weld.context.ForwardingContextual.destroy(ForwardingContextual.java:34) [:6.0.0.Final]
	at org.jboss.weld.context.CreationalContextImpl.destroy(CreationalContextImpl.java:100) [:6.0.0.Final]
	at org.jboss.weld.context.CreationalContextImpl.release(CreationalContextImpl.java:90) [:6.0.0.Final]
	at org.jboss.weld.integration.ejb.SessionBeanInterceptor.preDestroy(SessionBeanInterceptor.java:112) [:6.0.0.Final]
	... 232 more

Mein Entity ist mit JPA Annotationen gemacht. Kennt jemand die Fehlernachricht?
 
Meine Vermutung ist,dass die persistence.xml nicht eingelesen wird, weil ich folgende Ausgabe im log finde
Java:
09:24:35,892 INFO  [StdSchedulerFactory] Quartz scheduler 'JBossQuartzScheduler' initialized from an externally opened InputStream.
09:24:35,892 INFO  [StdSchedulerFactory] Quartz scheduler version: 1.8.3
09:24:35,892 INFO  [QuartzScheduler] Scheduler JBossQuartzScheduler_$_NON_CLUSTERED started.
09:24:37,017 INFO  [ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=DefaultDS' to JNDI name 'java:DefaultDS'
09:24:37,017 INFO  [PersistenceUnitDeployment] Starting persistence unit persistence.unit:unitName=jboss-ejb3-timerservice-mk2.jar#timerdb
09:24:38,470 INFO  [Version] Hibernate Commons Annotations 3.2.0.Final
09:24:38,501 INFO  [Environment] Hibernate 3.6.0.Final
09:24:38,517 INFO  [Environment] hibernate.properties not found
09:24:38,517 INFO  [Environment] Bytecode provider name : javassist
09:24:38,532 INFO  [Environment] using JDK 1.4 java.sql.Timestamp handling
09:24:38,876 INFO  [Version] Hibernate EntityManager 3.6.0.Final
09:24:38,986 INFO  [Ejb3Configuration] Processing PersistenceUnitInfo [
	name: timerdb
	...]

hibernate.properties not found hört sich nicht gut an. Und die persistence.unit klingt auch komisch

Meine xml
[XML]
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="manager" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/DefaultDS</jta-data-source>
<class>test.myEntity</class>

<properties>
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="javax.persistence.jdbc.user" value="user" />
<property name="javax.persistence.jdbc.password" value="pwd" />
<property name="javax.persistence.jdbc.url" value="jdbc😱racle:thin:" />

<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect" />
<property name="hibernate.session_factory_name" value="java:hibernate/SessionFactory" />
<property name="hibernate.hbm2ddl.auto" value="validate" />
</properties>

</persistence-unit>
</persistence>
[/XML]

Wenn ich mir die Properties der EntityManagerFactory ausgeben lasse sehe ich auch folgende Ausgabe
Code:
hibernate.hbm2ddl.auto	update
mhm? Muss ich beim JBoss noch was einstellen, das die Datei einliest?

Liegt bei mir unter WebContent-->META-INF
 
Eigentlich gehört die in einen Source Folder z.B. "src" und da in den Ordner META-INF.

Ansonsten sind DAOs eigentlich Stateless.
 
Eigentlich gehört die in einen Source Folder z.B. "src" und da in den Ordner META-INF.

Ansonsten sind DAOs eigentlich Stateless.

Okay probier ich es mal in dem src ordner

Wenn ich den EntityManager EXTENDED in das DAO injecte muss der doch glaub Stateful sein sonst bekomm ich ein error:
Code:
It is illegal to inject an EXTENDED PC into something other than a SFSB

Seam Framework - Can't use PersistenceContextType.EXTENDED
 
Ok, das hatte ich übersehen. Hab ich so bisher auch noch nirgends gesehen 😀

Ja das ist für lang laufende Session da ist das Transaktion verhalten anders.

Okay wie aussieht liest die xml nun ein =)...

Aber ich glaub ich hab den Unterschied zwischen RESOURCE_LOCALund JTA nicht ganz verstanden.
Wenn ich JTA verwende werden die Server properties über eine xml eingelesen und meine Transaktion werden darüber gehandelt. Versteh ich nicht so ganz wie das funktioniert.
Das heißt ich benutz erst einmal "RESOURCE_LOCAL" und bekomm ich immer folgende Exception
Code:
  Deployment "persistence.unit:unitName=xPP_Prototyp.war#manager" is in error due to the following reason(s): java.lang.RuntimeException: Specification violation [EJB3 JPA 6.2.1.2] - You have not defined a non-jta-data-source for a RESOURCE_LOCAL enabled persistence context named: manager

[XML]
<persistence-unit name="PricePilot" transaction-type="RESOURCE_LOCAL">
<!-- <provider>org.hibernate.ejb.HibernatePersistence</provider> -->
<!-- <jta-data-source>java:/ManagerDS</jta-data-source> -->
<properties>
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect" />
<property name="hibernate.session_factory_name" value="java:hibernate/SessionFactory" />
<property name="hibernate.hbm2ddl.auto" value="validate" />
</properties>

</persistence-unit>
</persistence>
[/XML]

Und wenn ich JTA verwenden will muss ich im JBoss eine ManagerDS.xml anlegen?
 
Okay habs jetzt über die XML gemacht und es sieht immer besser aus 😉
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben