-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 8 posts ] 
Author Message
 Post subject: Zugriff auf entity bean. EJB3 Jboss hibernate
PostPosted: Wed Apr 11, 2007 3:59 pm 
Newbie

Joined: Wed Apr 11, 2007 3:44 pm
Posts: 5
Hallo,

vorab mal:
Jboss 4.2.0
Hibernate Version 3.2.1.ga (bereits in jboss integriert)
MySql

ich versuche erste EJB's zum laufen zu bekommen und scheitere daran auf eine Entity-Bean zuzugreifen.
Eine stateless und eine statefull session bean funktionieren bereits.
Beim Erzegen der EntityManagerFactory hängt es allerdings. Dabei bekomme ich immer eine PersistenceException:


javax.persistence.PersistenceException: No Persistence provider for EntityManager named harri_em
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33)
at org.emetis.testejb3.client.TestClient.main(TestClient.java:38)



Ich packe die EntityBean sowie die SesionBeans in jars, die wiederum in einem ear gepackt sind.
Innerhalb des jars der EntityBean im Verzeichnis META-INF befindet sich meine persistence.xml:


<?xml version="1.0" encoding="UTF-8"?>

<persistence>
<persistence-unit name="harri_em">
<jta-data-source>java:/MySqlDS</jta-data-source>
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>org.emetis.testejb3.server.accessteschd.AccessTeschdBean</class>
<properties>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
</properties>
</persistence-unit>
</persistence>


Meine Datasource befindet sich im deploy-Verzeichnis meines Servers und definiert eine Datasource zu einer MySql-Datenbank:


<?xml version="1.0" encoding="UTF-8"?>

<datasources>
<local-tx-datasource>
<jndi-name>MySqlDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/emetis_one</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>testuser</user-name>
<password>testUserPwd</password>
<min-pool-size>1</min-pool-size>
<max-pool-size>20</max-pool-size>

<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>



Das Deployment schein auch schon irgendwie zu funktionieren. Ich kann über den Initalcontext auf die SessionBeans zugreifen.
In der Jboss JMX-Console erscheint meine perisstence unit:

persistence.units
* ear=testEjb3.ear,unitName=harri_em

In meinem Testclient wird dann allerdings beim Erzeugen der EntitymanagerFactory die PersistenceException geworfen:



Code:
Hashtable<String, String> env = new Hashtable<String, String>();
env.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
env.put("java.naming.provider.url","localhost:1099");
env.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces ");

InitialContext ctx = new InitialContext(env);
                 
HelloWorld hello = (HelloWorld)ctx.lookup("testEjb3/HelloWorldBean/remote");
System.out.println(">"+hello.getGreeting());
       
HelloWorld2 hello2 = (HelloWorld2)ctx.lookup("testEjb3/HelloWorldBean2/remote");
System.out.println(">>"+hello2.getGreeting());
hello2.setName("Harri");
System.out.println(">>"+hello2.getGreeting());
       
EntityManagerFactory emf = Persistence.createEntityManagerFactory("harri_em");
EntityManager manager = emf.createEntityManager();
EntityTransaction tx = manager.getTransaction();
       
tx.begin();
manager.persist(new AccessTeschdBean("valOne", "valTwo"));
tx.commit();
manager.close();



Ich habe wirklich keine Ahnung mehr wo ich den Fehler noch suchen soll.

Was ich nicht verstehe ist, wenn ich auf SessionBeans zugreife gebe ich über die Properties des InitialContexsts beispielsweise an auf welchem Rechner der jboss läuft. Über dieses Propertie bekommt der Client die Infomation wo er zu "suchen" hat.
Woher kommt diese Information im Falle der EntityBeans? Sprich Eruegen des Entitymanagers?
Möglicherweise muss dies auch noch konfiguriert werden? Aber wie?

Vielen Dank schonmal für die Hilfe.


Gruß
Harri Eleftheriadis


Top
 Profile  
 
 Post subject: Zugriff auf entity bean. EJB3 Jboss hibernate - EntityManage
PostPosted: Thu Apr 12, 2007 5:13 am 
Beginner
Beginner

Joined: Fri Jun 30, 2006 6:54 am
Posts: 20
Location: Germany
Hallo Harry,

warum hantierst du in deinem Testclient mit dem EntityManager?

Erledige das doch alles direkt in einer Bean Klasse:

Code:
@Stateless
public class AccessTeschdBeanManager implements AccessTeschdBeanManagerRemote {

    @PersistenceContext("harri_em")
    EntityManager em;

    /* Methode aus remote interface */
    public void createInstance(final AccessTeschdBean accessTeschdBean) {
        em.persist(accessTeschdBean);
    }

}


Hoffe, das bringt dich weiter...

Henning Malzahn


Top
 Profile  
 
 Post subject:
PostPosted: Thu Apr 12, 2007 5:51 am 
Newbie

Joined: Wed Apr 11, 2007 3:44 pm
Posts: 5
Vielen Dank für dein Hilfe,

ich habe verstanden, daß man die auf den Manager aus dem client heraus nciht zugreifen sollte.
Stattdessen besser eine SessionBean verwendet um im Server dann auf die Entities zuzugreifen.

Jetzt habe ich allerdings ein anderes Problem. Die SessionBean kennt die EntityBean wohl nicht. ich bekomme nämlich ein Exception


Unknown entity: org.emetis.testejb3.server.accessteschd.AccessTeschdBean


Wie macht man die beiden miteinander bekannt? Vielleicht auch über Annotations?


Vielen Dank


Top
 Profile  
 
 Post subject:
PostPosted: Thu Apr 12, 2007 6:29 am 
Beginner
Beginner

Joined: Fri Jun 30, 2006 6:54 am
Posts: 20
Location: Germany
Hallo Harri,

hmmm - ich habe da eigentlich bei mir nix besonderes gemacht.
Habe eine Entity Bean und eine Session Bean die den Manager spielt...

Koenntest du vielleicht einfach mal ein wenig SourceCode posten..?

Bis dann,

Henning

PS: Deine Entity ist aber schon mit @Entity annotiert, oder?


Top
 Profile  
 
 Post subject:
PostPosted: Thu Apr 12, 2007 10:23 am 
Newbie

Joined: Wed Apr 11, 2007 3:44 pm
Posts: 5
Hallo,

also ich habe mittlerweile auch keine Ahung mehr woran es liegen könnte.
hier mal der Code den ich verwende:

SessionBean

Code:
@Stateless
@Remote(org.emetis.testejb3.server.helloworld.HelloWorld.class)
public class HelloWorldBean implements HelloWorld, Serializable{
   private static final long serialVersionUID = 5909166101546098024L;

   public String getGreeting() throws RemoteException{
      return "Servus Harri";      
   }
   
   @PersistenceContext(unitName="harri_em")
   EntityManager manager;
   public String createInstance(final AccessTeschdBean accessTeschdBean) throws RemoteException {
      try{
         manager.persist(accessTeschdBean);
      }
      catch (Exception e) {
         StringWriter sw = new StringWriter();
         e.printStackTrace(new PrintWriter(sw, true));                  
         return sw.toString();
      }   
      return "OK";
   }
}


Entity Bean

Code:
@Entity
@PersistenceContext(unitName = "harri_em")
@Table(appliesTo = "teschd")
public class AccessTeschdBean implements Serializable{
   private static final long serialVersionUID = 8780872855146697292L;
   
   private int id;
   private String value1;
   private String value2;
   
   public AccessTeschdBean() {}
   
   public AccessTeschdBean(String aValue2) {
      this.value2 = aValue2;
   }
   
   public AccessTeschdBean(String aValue1, String aValue2) {
      this.value1 = aValue1;
      this.value2 = aValue2;
   }
   
   /* ************************************************* *
    *
    * ************************************************* */
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   @Column(name = "id", nullable = false, updatable = false)
   public int getId() {
      return id;
   }
   public void setId(int id) {
      this.id = id;
   }
   @Column(name = "value1")
   public String getValue1() {
      return value1;
   }
   public void setValue1(String value1) {
      this.value1 = value1;
   }
   @Column(name = "value2", nullable = false)
   public String getValue2() {
      return value2;
   }
   public void setValue2(String value2) {
      this.value2 = value2;
   }   
}



Ich habe alle EJB's jeweils in einem jar verpackt. Dabei habe ich alle Beanklassen mit samt der Packagestruktur drin.
In dem verzeichnis META-INF des ear befindet sich meine application.xml

Application.xml

Code:
<application>
   <display-name>Ejb3test</display-name>
   
   <module>
      <ejb>HelloWorldBean.jar</ejb>
   </module>
   <module>
      <ejb>HelloWorldBean2.jar</ejb>
   </module>
   <module>
      <ejb>AccessTeschdBean.jar</ejb>
   </module>   
</application>


Auf der selben Ebene wie META-INF im ear sind die jars. Z.B. die EntityBean. Im META-INF der Entity befindet sich die persistence.xml:

persistence.xml

Code:
<?xml version="1.0" encoding="UTF-8"?>

<persistence>
  <persistence-unit name="harri_em" >
    <jta-data-source>java:/MySqlDS</jta-data-source>
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>org.emetis.testejb3.server.accessteschd.AccessTeschdBean</class>
    <properties>       
      <property name="hibernate.show_sql" value="true"/>   
      <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
   </properties>
  </persistence-unit>
</persistence>


Die EntityBean
org.emetis.testejb3.server.accessteschd.AccessTeschdBean
AcessteschdBean.jar


|_META-INF
| |__persistence.xml
| |__MANIFEST.MF
|
|_org/emetis/testejb3/server/accessteschd/AccessTeschBean.class


In der JMX-Console des Jboss sieht es auch so aus als wäre alle Beans deployed worden:

jboss.j2ee
* ear=testEjb3.ear,jar=HelloWorldBean2.jar,name=HelloWorldBean2,service=EJB3
* module=AccessTeschdBean.jar,service=EJB3
* module=HelloWorldBean.jar,service=EJB3
* module=HelloWorldBean2.jar,service=EJB3
* service=ClientDeployer
* service=EARDeployer
* service=EARDeployment,url='testEjb3.ear'


..ich hoffe ich habe jetzt niemanden mit zu viel Information erschlagen :-)


Vielen Dank


Top
 Profile  
 
 Post subject:
PostPosted: Fri Apr 13, 2007 3:19 am 
Beginner
Beginner

Joined: Fri Jun 30, 2006 6:54 am
Posts: 20
Location: Germany
Guten Morgen Harri,

wenn deine Beans in unterscheidlichen .jar-Files liegen muss du die Beans
explizit in der Datei persistence.xml referenzieren.

Versuch mal bitte folgendes:

In der Datei persistence.xml trägst du jede deiner Entity Klassen folgendermaßen ein:

Code:
<persistence>
    <persistence-unit name="harri_em">
        ....

        <class>com.harri.beans.AccessTeschdBean</class>

        ....

    <properties>
        ...
    <properties>

    </persistence-unit>
</persistence>


Ich hatte hier das gleiche Problem - wir Entwickeln gerade eine Projekt, das in drei Unterprojekte aufgeteilt ist. Einige Beans werden von allen drei Sub-Projekten verwendet und deswegen auch in ein extra .jar-File verpackt. Nach dem expliziten <class> mapping lief es...

Hoffe, das ist es...

Henning

PS: Wenn englische Literatur ok ist kann ich dir nur wärmstens
"Enterprise Java Beans 3.0", Burke/ Monson-Haefel, O'Reilly empfehlen...


Top
 Profile  
 
 Post subject:
PostPosted: Fri Apr 13, 2007 5:25 am 
Newbie

Joined: Wed Apr 11, 2007 3:44 pm
Posts: 5
Leider ist es das nicht. Die Klasse habe ich bereits in der persistence.xml angegeben.

In meinem letzten Beitrag habe ich die persistence.xml mitgepostet. Da ist die EntityBean bereits enthalten

Code:
<class>org.emetis.testejb3.server.accessteschd.AccessTeschdBean</class>


Ich habe allerdings ein anderes, für mich unverständliches Problem entdeckt.

(1.) PersistenceContext wird gar nicht definiert in der SessionBean
>> Deployement klappt
>> EntityBean ist bekannt, manager ist aber null

(2.) PersistenceContext-Definition (in der SessionBean) mit name
@PersistenceContext(name="harri_em")
>> Deployment funktioniert nicht da unitname nicht bekannt
>> JBoss: There is no default persistence unit in this deployment

(3.) PersistenceContext-Definition (in der SessionBean) mit unitName
@PersistenceContext(unitName="harri_em")
>> Deployment funktioniert nicht da name nicht bekannt
>> JBoss: JBoss requires name() for class level @PersistenceContext

(4.) PeristenceContext-Definition (in der SessionBean) mit namu UND unitName
@PersistenceContext(unitName="harri_em", name="harri_em")
>> Deployement klappt
>> EntityBean ist bekannt, manager ist aber null
>> Verhalten wie (1.)

Aber noch eine weitere Unklarheit gibt es. Wo muss @PersistenceContext eigentlich stehen? Vor der KlassenDefinition der SessionBean oder innerhalb der Klasse?

Vor der Klasse:
Code:
@Stateless
@PersistenceContext(unitName="harri_em", name="harri_em")
@Remote(org.emetis.testejb3.server.helloworld.HelloWorld.class)
public class HelloWorldBean implements HelloWorld, Serializable{


Innerhalb der klasse:
Code:
@PersistenceContext(unitName="harri_em", name="harri_em")
   EntityManager manager;
   public String createInstance(final AccessTeschdBean accessTeschdBean) throws RemoteException {


Innerhalb der Klasse bekomme ich eine weitere Verhaltensvariante

(5.) PeristenceContext innherhalb der Klasse mit unitName UND name
>> Deployment klappt
>> Entity nicht bekannt


Die Variante die "am ehesten" funktioniert ist die (1.) und (4.).
Vielleicht hole ich mir den EntityManager auch nicht richtig? Für mich EJB/hibernate laien sieht das nämlich nach normalem java Verhalten aus.
Es gibt keine Stelle im Code wo ich "aktiv" den Entitymanager setze.
Nicht sowas wie:
Code:
Entitymanager manager = BlaBla.megthodeXY();


hier mal mein code:
Code:
package org.emetis.testejb3.server.helloworld;

import java.io.PrintWriter;
import java.io.Serializable;
import java.io.StringWriter;
import java.rmi.RemoteException;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.emetis.testejb3.server.accessteschd.AccessTeschdBean;

@Stateless
@Remote(org.emetis.testejb3.server.helloworld.HelloWorld.class)
public class HelloWorldBean implements HelloWorld, Serializable{
   private static final long serialVersionUID = 5909166101546098024L;

   public String getGreeting() throws RemoteException{
      return "Servus Harri";
      
   }
   
   @PersistenceContext(unitName="harri_em", name="harri_em")
   EntityManager manager;
   public String createInstance(final AccessTeschdBean accessTeschdBean) throws RemoteException {
      try{
         System.out.println("AccessteschBean: "+accessTeschdBean.toString());
         manager.persist(accessTeschdBean);
      }
      catch (Exception e) {
         StringWriter sw = new StringWriter();
         e.printStackTrace(new PrintWriter(sw, true));                  
         return sw.toString();
      }   
      return "OK";
   }
}



Ich weiss langsam wirklich nicht mehr weiter! bin bald am Durchdrehen!
Ich kämpfe jetzt schon so lange mit diesem Problem!


Vielen Dank für jede Hilfe!

Gruß
der verzweifelte Harri E.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Apr 13, 2007 2:34 pm 
Newbie

Joined: Wed Apr 11, 2007 3:44 pm
Posts: 5
Halleluja!! Das ganze hat mich zwar 1000 haare gekostet und 2000 graue Haare eingebracht, aber ich konnte den Fehler finden!

Das problem ist, das ich die Annotation @org.hibernate.annotations.Entity verwendet habe
stattdessen muss natürlich @javax.persistence.Entity verwendet werden!
..ist aber auch gefährlich!

Vielen vielen Dank Henning für deine Ausdauer!
Wenn wir uns mal über den weg laufen spendier ich dir auf jeden Fall ein Bier :-)


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 8 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.