# Problem mit @Entity



## moloch (4. Mrz 2010)

Hallo, bin ein Anfänger auf dem Entity Gebiet und versuche mir ein einfaches Beispiel mit Eclipse zu programmieren.
Ich kriege immer diese Fehlermeldung von Glassfish


```
java.lang.IllegalArgumentException: Invalid ejb jar my-ejb.jar: 
it contains zero ejb. A valid ejb jar requires at least one 
session/entity/message driven bean 
although my jar file contains some @Entity annotated classes
```

Habe auch schon auf der Glassfish Seite gesehen dass andere auch das Problem haben. Es wird gesagt das man die Enity Bean nicht als EJB deklarien soll, da dass bei Version von EJB 3 der Fall war. Ich weiss jedoch nicht wie ich in Eclipse das bewerkstelligen soll. Kann mir da jemand helfen?

Grüße


----------



## bronks (4. Mrz 2010)

Die Fehlermeldung ist m.E. ziemlich beknackt und erfordert mal wieder, daß man sich mit historischem Mist aus J2EE auskennen und die Unterschiede zwischen J2EE und EE5 kennen muß, um damit etwas anfangen zu können. 

Einfach erklärt: Du mußt eine Session- oder MessageDriven- oder eine EntityBean in Deinem EjbJar haben. Blöderweise ist die erwähnte "@Entity annotated classes" keine EnterpriseBean und deshalb auch keine EntityBean, sondern nur ein klugsch.....isch genanntes POJO.

Gegenmaßnahme: Lege in Dein EjbJar eine SessionBean und ruh is ... ...


----------



## moloch (4. Mrz 2010)

hallo, danke erstmal für deine antwort. also ich habe jetzt eine @Stateless bean per eclipse angelegt (leer also dummy)..
jetzt bekomme ich diese meldung

[Java]
cannot Deploy 01Beispiel_MeineErste_EntityBean
  Deployment Error for module: 01Beispiel_MeineErste_EntityBean: Exception while deploying the app : java.lang.NullPointerException%%%EOL%%%
[/Java]

muss ich noch zusätzlich in den vielen xml s was einstellen?

hast du vielleicht einen tip wo man ausführlich und gut beschriebene leichte beispiele findet? ich baue das eigentlich aus einem buch nach (Java EE 5 Masterclass) und hab halt trotzdem diese Problemchen..

Grüße


----------



## moloch (4. Mrz 2010)

ok scheint sich was getan zu haben. ohne wirklich zu wissen was ich tue hab ich auf der client seite jetzt alle möglichen libraries von hibernate importiert und jetzt kommt zumindest die meldung das die sql syntax falsch ist... da der sinn von hibernate ja aber eigentlich ist das automatisch richtig zu machen (wenn ich es nicht falsch verstanden habe) verstehe ich das problem wiederrum auch nicht... oje.. dacht ejb 3 soll leicht sein.


----------



## bronks (4. Mrz 2010)

Da kann man einiges in der persistence.xml einstellen.


----------



## moloch (4. Mrz 2010)

ja stimmt, da war noch ein fehler. der dialect war noch falsch.
also zumindest wird die tabelle angelegt schon mal, leider ohne inhalt.. dazu noch ne idee? 
danke aber schon mal für deine hilfe


----------



## bronks (4. Mrz 2010)

Zeig mal den Code, welcher den Inhalt erzeugen soll.


----------



## moloch (5. Mrz 2010)

[Java]
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.persistence.Persistence;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.EntityManagerFactory;

import com.sun.grizzly.Context;

import de.st.persistence.bean.Person;


public class Main {



	public static void main(String[] args) {

		try {
			EntityManagerFactory emf = Persistence
					.createEntityManagerFactory("masterclass");

			EntityManager manager = emf.createEntityManager();

			Person person = new Person("Nachname", "Vorname", 28);

			manager.persist(person);

			manager.close();

			emf.close();

		} catch (Exception exc) {
			exc.printStackTrace();
		}
	}

}
[/Java]


----------



## Landei (5. Mrz 2010)

Die Klasse Person wäre natürlich auch nicht ganz uninteressant ;-)


----------



## moloch (5. Mrz 2010)

[Java]
package de.st.persistence.bean;

import java.io.Serializable;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name = "PERSON")
public class Person implements Serializable{

	private static final long serialVersionUID = -3370471288109320024L;

	private int id;
	private String vorname;
	private String nachname;
	private Integer alter;	


	// Standard Konstruktor
	public Person() {
	}

	// Minimaler Konstruktor
	public Person(String sNachname) {

		this.nachname = sNachname;
	}

	// Vollständiger Konstruktor
	public Person(String sNachname, String sVorname, Integer iAlter) {
		this.nachname = sNachname;
		this.vorname = sVorname;
		this.alter = iAlter;
	}

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id")
	public int getId() {
		return id;
	}

	protected void setId(int id){
		this.id = id;
	}

	@Column(name="nach_name", nullable=false, length=120)
	public String getNachname(){
		return nachname;
	}
	public void setNachname(String nachname){
		this.nachname = nachname;
	}

	@Column(name="vor_name", length=120)
	public String getVorname(){
		return vorname;
	}
	public void setVorname(String vorname){
		this.vorname = vorname;
	}

	@Override
	public String toString() {
		return "Person [alter=" + alter + ", id=" + id + ", nachname="
				+ nachname + ", vorname=" + vorname + "]";
	}



}

[/Java]


----------



## bronks (5. Mrz 2010)

moloch hat gesagt.:


> [Java]
> ...
> public static void main(String[] args) {
> ...
> [/Java]


Da hast Du Dich ein bissl verfahren. Sowas wird Dir Glassfish nicht ausführen.

Ist zwar für JBoss, aber da ist kurz und einfach dargestellt, wie das Thema zu funktionieren hat: First EJB 3 Tutorial

Der Persistenzteil ist bei Dir OK, aber Du brauchst für eine EE-App die SessionBean und den Client.


----------



## moloch (5. Mrz 2010)

der client soll ja die main methode sein. also so ist es in eclipse auch angelegt..ein ejb projekt mit der @Entity 
und ein client mit der main... jboss kriegt ja nur die entity 

oder versteh ich was falsch


----------



## bronks (5. Mrz 2010)

moloch hat gesagt.:


> der client soll ja die main methode sein. also so ist es in eclipse auch angelegt..ein ejb projekt mit der @Entity
> und ein client mit der main... jboss kriegt ja nur die entity
> 
> oder versteh ich was falsch


Großes Mißverständnis! 

Du muß Dir immer vorstellen, daß der Server nicht lokal läuft. An die Entity kommst Du remote nicht ran, denn es ist keine EnterpriseBean. Du mußt lokal, auf dem Server, mit einer SessionBean auf die Entity zugreifen. Diese SessionBean machst Du remote, als Fassade, für den Client verfügbar. Der Client ruft dann eine Methode der SessionBean auf.


----------



## moloch (5. Mrz 2010)

hallo, verstehe. also ich habe versucht das beispiel zu erstellen wovon du mir einen link gepostet hast. war eigentlich alles gut verständlich nur den part mit dem jndi einrichten und auf welche db man zugreift also  das zu konfigurieren verstehe ich nicht ganz in dem beispiel..


----------



## bronks (5. Mrz 2010)

In dem Beispiel ist ein kleiner Fehler drin. Der JNDI Name der Datasource muß ejb3ProjectDS heißen.


----------



## moloch (6. Mrz 2010)

hallo, ich kann erst am montag wieder probieren. jedoch kann ich so schon sagen dass ich das ganze prinzip nicht verstanden habe mit dem jndi, ich meine jetzt nicht wofür er da ist sondern das einstellen über den quellcode und diesen extra dateien die man dafür anlegen soll. und wenn ich jetzt z.b. mysql verwenden möchte, wo stelle ich die zugriffs geschichten ein in dieser -ds.xml`?


----------



## Landei (6. Mrz 2010)

Dumme Frage: Warum versuchst du nicht erst einmal _ohne_ einen Application-Server? Die JPA lässt sich auch (wenn auch nicht so bequem) in ganz normalen J2SE-Programmen verwenden: Using the Java Persistence API in Desktop Applications


----------



## bronks (9. Mrz 2010)

moloch hat gesagt.:


> ... z.b. mysql verwenden möchte, wo stelle ich die zugriffs geschichten ein in dieser -ds.xml`?




```
<datasources>
<local-tx-datasource>
  <jndi-name>jdbc/test</jndi-name>
  <connection-url>jdbc:mysql://localhost/testdatenbank</connection-url>
  <driver-class>com.mysql.jdbc.Driver</driver-class>
  <user-name>root</user-name>
  <password>password</password>
  <metadata>
     <type-mapping>mySQL</type-mapping>
  </metadata>
</local-tx-datasource>
</datasources>
```


----------



## moloch (9. Mrz 2010)

ah ja ok. dazu gibt es auch beispiele im application server...

mal was "anderes" hat jemand einen Tip / link wo man eine grafische ansicht hat über ein n- tier system wo ersichtlich wird welcher container was läd, instanziert etc (webserver z.b. servlet)... das man mal ein überblick über die architektur bekommt..


----------

