# Entity Bean ignoriert Datenbank



## gedachtnissieb (14. Jan 2007)

Hi,

Ich probiere grade mit Entity Beans (CMP , mysql4.1, WTP) herum, nachdem ich mich mit Stateful und Stateless Beans probiert habe.

Ich nutze Eclipse, hab ein Projekt erstellt, Datenbank und alles angegeben, so dass sogar ein Reiter namens
"Database Explorer" erschien. die Datenbank enthält 4 Tabellen, eine davon will ich nur nutzen.

Ich kann mittels der create(Signatur sig..) Methode auch wunderbar Beans erstellen, die er auch speichert. Allerdings speichert Java die in einer Datei in jboss4.01... /tmp/deploy/tmpxxxKundendaten.jar

Problem:
Es erfolgt KEIN Zugriff auf meine Datenbank! Die Daten, die ich mit der Datenbank hochgeladen habe, erreiche ich nicht. Es ist der Bean sogar egal, ob mein MySQL Server läuft oder nicht. Einträge in der ejb-jar.xml sind gemacht.

Hab schon versucht den zu Erzwingen mittels Aufruf von ejbStore() und ejbLoad()...
Lustigerweise kann ich die tmp dateien, in denen das Projekt die neuen Daten anscheinend speichert löschen. Und trotzdem kennt er noch die vorhin kreierten neuen Kunden ^^

Aufgabe: Wir sollen uns mittels Webclient einloggen oder einen neuen Nutzer anlegen könnnen. Eingeloggt, soll man sich dann seine Daten angugucken können... naja.

Selbst wenn die Bean/der Container auf die Datenbank zugreifen könnte. Muss ich die Prüfung der Login Daten selbst implementieren? Das mache ich ja mit der findByPrimaryKey Methode, odeR?

--
edit:
wozu ist die ejbPostCreate Methode. Hab keine klare Antwort im Netz gefunden, weiß nur, dass er die Methode (wenn sie die gleiche Signatur wie die aufgerufene create(Sig sig) hat, automatisch aufgerufen wird....


danke


----------



## gedachtnissieb (15. Jan 2007)

mh.. hat dann jemand ne Idee, warum ich in der Regel (als einzigster...?) auf meine Posts keine Antwort bekomme?


----------



## Guest (15. Jan 2007)

gedachtnissieb hat gesagt.:
			
		

> mh.. hat dann jemand ne Idee, warum ich in der Regel (als einzigster...?) auf meine Posts keine Antwort bekomme?


Vermutlich deswegen, weil du mit diesem Thread zu viele Anfängerfragen stellst, und niemand Lust 
hat ein Buch darüber zu schreiben.


----------



## gedachtnissieb (15. Jan 2007)

also gut, neuer Versuch, weniger Gelaber:

Meine EntityBean speichert die Datenänderungen anscheinend in einer Datei in jboss4.01/.../tmp/deploy/tmpxxxKundendaten.jar, aber nicht in der von mir angegebenen Datenbank (MySql)
Der Aufruf von ejbStore bringt auch nix (sichtbares).

Den Aufruf manuell zu erstellen ist ja nicht Sinn einer EntityBean, oder? Dann hätte ich ja die Datenbank nicht angeben müssen, bei der Erstellung eines Beans...

Was mache ich falsch?  :meld: Weitere Belehrungen erwünscht...


----------



## bronks (15. Jan 2007)

Anonymous hat gesagt.:
			
		

> gedachtnissieb hat gesagt.:
> 
> 
> 
> ...


So einfängermäßig ist die Frage nicht, denn aus unachtsamkeit rutscht man schnell mal defaultdatenbank vom JBoss.

Eher könnte ich annehmen, daß genau die Leute welche das beantworten können, etwas vorsichtig beim Schreiben sind, wenn die Antwort ein längerer Text werden könnte. Denn es motiviert nicht unbedingt etwas zu schreiben, um am nächsten Tag festzustellen, daß es irgendein Mod oder Admin grundlos gelöscht hat und sich zu der Löschung, nach mehrmaligem nachfragen, niemand bekennt.


----------



## bronks (15. Jan 2007)

gedachtnissieb hat gesagt.:
			
		

> ... Den Aufruf manuell zu erstellen ist ja nicht Sinn einer EntityBean, oder? Dann hätte ich ja die Datenbank nicht angeben müssen, bei der Erstellung eines Beans...
> 
> Was mache ich falsch?  :meld: Weitere Belehrungen erwünscht...


Poste mal den Code Deiner Bean und der DS.


----------



## gedachtnissieb (15. Jan 2007)

```
public abstract class KundendatenBean implements javax.ejb.EntityBean {	
	/**
	 *
	 * 
	 * The  ejbCreate method.
	 * 
	 *
	 *  
	 * @ejb.create-method 
	 *  
	 * @generated
	 */
	public java.lang.String ejbCreate() throws javax.ejb.CreateException {
		// EJB 2.0 spec says return null for CMP ejbCreate methods.
		// TODO: YOU MUST INITIALIZE THE FIELDS FOR THE BEAN HERE. 
		// setMyField("Something"); 
		// begin-user-code
		return null;
		// end-user-code
	}
	
	/**
...
	 */
	public java.lang.String ejbCreate(String kNr, String passwort, String kAdresse, String kName)throws javax.ejb.CreateException{
		setKNr(kNr);
		setKName(kName);
		setKAdresse(kAdresse);
		setPasswort(passwort);
		return this.ejbCreate();
	}

	/**
...
	 */
	public void ejbPostCreate() throws javax.ejb.CreateException {
		// begin-user-code
		System.out.println("ejbPostCreate started");
		// end-user-code
	}
	
	/**
...
	 */
	public void ejbPostCreate(String kNr, String passwort, String kAdresse, String kName) throws javax.ejb.CreateException {
		// begin-user-code
		System.out.println("ejbPostCreate 2 started");
		// end-user-code
		try {
			
			this.ejbStore();
		} catch (EJBException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (RemoteException e) {
			// TODO Auto-generated catch block 
			e.printStackTrace();
		}
	}

	/**
...
	 */
	public abstract java.lang.String getKNr();

	/**
...
	public abstract void setKNr(java.lang.String kNr);

	/**
...
	 */
	public abstract java.lang.String getKName();

	/**
...
	 */
	public abstract void setKName(java.lang.String kName);

	/**
	 *
	 *
	 * 
	 * CMP Field kAdresse
	 *
	 * Returns the kAdresse
	 * @return the kAdresse
	 * 
	 * 
	 *
	 *  
	 *
	 * @ejb.persistent-field 
	 * @ejb.persistence
	 *    column-name="3"
	 *     jdbc-type="VARCHAR"
	 *     sql-type="VARCHAR(0)"
	 *     read-only="false"
	 *  
	 *
	 * @ejb.interface-method
	 * 
	 *  
	 * @generated
	 */
	public abstract java.lang.String getKAdresse();

	/**
	 * 
	 * Sets the kAdresse
	 * 
	 * @param java.lang.String the new kAdresse value
	 * 
	 * 
	 *  
	 * @ejb.interface-method
	 * 
	 * @generated 
	 */
	public abstract void setKAdresse(java.lang.String kAdresse);

	/**
...
	 */
	public abstract java.lang.String getPasswort();

	/**
...
	 */
	public abstract void setPasswort(java.lang.String passwort);

	/* (non-Javadoc)
	 * @see javax.ejb.EntityBean#ejbActivate()
	 */
	public void ejbActivate() throws EJBException, RemoteException {
		// TODO Auto-generated method stub

	}

	/* (non-Javadoc)
	 * @see javax.ejb.EntityBean#ejbLoad()
	 */
	public void ejbLoad() throws EJBException, RemoteException {
		// TODO Auto-generated method stub

	}

	/* (non-Javadoc)
	 * @see javax.ejb.EntityBean#ejbPassivate()
	 */
	public void ejbPassivate() throws EJBException, RemoteException {
		// TODO Auto-generated method stub

	}

	/* (non-Javadoc)
	 * @see javax.ejb.EntityBean#ejbRemove()
	 */
	public void ejbRemove() throws RemoveException, EJBException,
			RemoteException {
		// TODO Auto-generated method stub

	}

	/* (non-Javadoc)
	 * @see javax.ejb.EntityBean#ejbStore()
	 */
	public void ejbStore() throws EJBException, RemoteException {
		System.out.println("ejbStore");
		// TODO Auto-generated method stub

	}

	/* (non-Javadoc)
	 * @see javax.ejb.EntityBean#setEntityContext(javax.ejb.EntityContext)
	 */
	public void setEntityContext(EntityContext arg0) throws EJBException,
			RemoteException {
		// TODO Auto-generated method stub

	}

	/* (non-Javadoc)
	 * @see javax.ejb.EntityBean#unsetEntityContext()
	 */
	public void unsetEntityContext() throws EJBException, RemoteException {
		// TODO Auto-generated method stub

	}

	/**
	 * 
	 */
	public KundendatenBean() {
		// TODO Auto-generated constructor stub
	}

}
```

Die xDoclet Anweisungen habe ich mal nur für eine getter und eine setter drin gelassen, zwecks Übersichtlichkeit...

Und was ist DS?


----------



## gedachtnissieb (15. Jan 2007)

du meinst Datasource? 

```
CREATE TABLE Kunden ( 
	kNr INT NOT NULL PRIMARY KEY,  
	kName VARCHAR(50) NOT NULL, 
	kAdresse VARCHAR(50), 
	passwort VARCHAR(50) NOT NULL); 

CREATE TABLE Artikel ( 
	aNr INT NOT NULL AUTO_INCREMENT PRIMARY KEY,  
	aBz VARCHAR(50) NOT NULL, 
	aPr DOUBLE,
        online BIT);
```


----------



## bronks (15. Jan 2007)

gedachtnissieb hat gesagt.:
			
		

> ... Die xDoclet Anweisungen habe ich mal nur für eine getter und eine setter drin gelassen, zwecks Übersichtlichkeit...
> 
> Und was ist DS?


Das wäre die DataSource gewesen. Siehe z.B. hier: http://www.informit.com/articles/article.asp?p=352320&rl=1

Die mußt Du Deiner Bean mitteilen z.B.: 

```
@jboss.persistence datasource="java:/jdbc/projektDS" datasource-mapping="PostgreSQL 8.0" create-table="true" remove-table="true" alter-table="true"
```

Wenn Du auf Deinem MySql nichts anderes draufhast, dann überleg Dir ob Du nicht evtl. auf eine andere DB wechselst. Den Luxus, daß es Dir die Tabellen anlegt, wie auf der HsqlDb hast Du damit nicht. Entsprechend kannst Du alter und remove-table knicken.


----------



## gedachtnissieb (15. Jan 2007)

mh in Eclipse kam halt ein schönes Fenster, in dem ich Infos über die Datenbank angab.

Eclipse: 





> Database Explorer - Connections - new Connection


genau so.

Ich dachte, dass er alle notwendigen xml Dateien gleich mit konfiguriert. 

edit:// ich stand wohl ein wenig auf dem Schlauch...


```
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>onlineshop</jndi-name>
<connection-url>
jdbc:mysql://127.0.0.1:3306/onlineshop
</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password<istdashierwirklichdaspasswort?</password>
</local-tx-datasource>
</datasources>
```

Hier ist meine onlineshop-ds.xml, die lag aber schon in server/default/deploy ....


----------



## gedachtnissieb (15. Jan 2007)

*zauber nach oben*  :noe:


----------



## bronks (16. Jan 2007)

gedachtnissieb hat gesagt.:
			
		

> ... Ich dachte, dass er alle notwendigen xml Dateien gleich mit konfiguriert ...


WTP hat zwar die tollsten Wizzards, aber sie machen immer nur die Hälfte der erwarteten Arbeit. So interessierts sich dieser Wizzard auch nicht für die CMP-Relations wenn man eine Bean aus einer Datenbanktabelle erstellt. Wegen ein paar anderen unberechenbaren Bugs und Problemen bin ich dann zur JBossIDE gewechselt.



			
				gedachtnissieb hat gesagt.:
			
		

> ```
> <?xml version="1.0" encoding="UTF-8"?>
> <datasources>
> <local-tx-datasource>
> ...


Wird die DS fehlerfrei deployed?



Schau mal hier rein: http://www.laliluna.de/database-ejb-hibernate-tutorials.html   "Simple Entity EJB ..." und "EJB-CMP-Relations" sind genau das Thema für Dich.


----------



## gedachtnissieb (16. Jan 2007)

DS wird fehlerfrei deployed. Hatte die selbe Datenbank bereits mit einem Stateful Bean getestet, bei dem ich auch die DS xml deployen musste. Hat alles BESTENS funktioniert...

Ich zieh mir den Link mal rein.. danke erstmal

Müsste ich eigentlich eine Fehlermeldung beim Starten bekommen, wenn MySql nicht an ist, oder erst beim Ausführen des Clients, der die Funktionen aufruf? Doch erst beim Client, oder nicht?


----------



## gedachtnissieb (16. Jan 2007)

Ein sensationeller Durchbruch in der Forschung  :autsch: 


```
17:59:01,843 ERROR [Kundendaten] Could not create entity
java.sql.SQLException: Column not found: KPASSWORT in statement [INSERT INTO KUNDENDATEN (kNr, kName, kAdresse, kPasswort) VALUES (?, ?, ?, ?)]
	at org.hsqldb.jdbc.Util.throwError(Unknown Source)
```

jetzt manipuliere ich dir XDoclet Anweisungen, aber dieselbe Fehlermeldung kommt immer wieder... 

Eine Spalte 





> KPASSWORT


 (case sensitive) hab ich gar nicht...

nur

setKPasswort
getKPasswort


die Spalten (column) habe ich anfangs mit 1, 2, 3, 4 benannt. Jetzt versucht sie umzubennen..... Aber selber Fehler..


----------



## Guest (16. Jan 2007)

```
/**
  * @ejb.interface-method
  * @ejb.persistent-field
  *    column-name="passwort"
  */
  public abstract String getKPasswort();
```
und lass den Sch.. mit dem manuellen Aufruf von ejbStore() in ejbCreate().

Jesus, ist das grausam, was du da machst.  :wink: Hol dir ein dickes Buch zu EJB und gehe es systematisch durch.
Anhand deines Codes erkennt man, dass dir die Konzepte dahinter gar nicht klar sind und so wirst du dich von 
einem Fehler zum nächsten vorarbeiten, ohne zu wissen, was da alles schief geht und vor allem warum.

Wo du neu anfängst, vergiss das alte EJB 2.x und lerne lieber gleich EJB 3.
Hier gibt es ein gutes Buch dazu: http://www.theserverside.com/tt/books/wiley/masteringEJB3/index.tss


----------



## gedachtnissieb (17. Jan 2007)

> und lass den Sch.. mit dem manuellen Aufruf von ejbStore() in ejbCreate().


Das sind nur erste Versuche.. inzwischen läuft meine Bean übrigens sensationell... 



> Jesus, ist das grausam, was du da machst. icon_wink.gif Hol dir ein dickes Buch zu EJB und gehe es systematisch durch.



richtig. Das ist eigentlich meine Art. Problem: Aufgabe an der Uni (FB BWL, sagt doch alles), um Klausur zu verbessern. 
Mehr als die Infos, die ich hatte, standen auch nicht auf den Folien.

Da ich für 3 Klausuren (in 3 Wochen) lerne (Hauptthema ist nicht Erstellung einer EJB in Eclipse ...) ist das ein echt schlechter Zeitpunkt, mir ein dickes Buch zu kaufen, das Werkzeug zu wechseln, womöglich sogar von Version 3, die NICHT relevant ist für uns, zu benutzen. Das verstehst du doch sicher...

Jetzt stehe also vor der Wahl:

1. hier im Forum "dumme Fragen zu stellen" 
2. mir das dicke Buch zu kaufen und eins der anderen 3, die hier liegen wegzulegen ;-)
3. Auf die Bonuspunkte zu verzichten
4. Jemanden fragen, der sich damit auskennt (was ich schon längst getan hätte, aber wir sitzen leider alle in einem Boot)

*Was hättest du gewählt? * ???:L 

Den Vorlesungsplan gewälzt um mögliche Aufgaben zur Notenverbesserung im vorweg zu klären mittels dicken Büchern? (An den Weihnachtsfeiertagen hatte ich noch Zeit gehabt, mist) ? :bahnhof: 


Naja, an vielen Fragen, die hier gestellt werden, sehe ich auch, dass die Leute teilweise keinerlei Grundkenntnis von der Materie habe. Ich finde das nicht so schlimm.


Wenn du also die Einstellung hast, dass alle Leute, die etwas nicht verstehen, sich erstmal ein dickes Buch kaufen sollten,  sind Foren sicherlich überflüssig, ne? Freut allerdings jede Buchhandlung und den Altpapierrecycling Markt. Das erklärt auch, warum du anscheinend gerne anonym, also aus dem off heraus, "gute Ratschläge" loslässt, ohne an den jeweiligen Kontext zu denken...

Thanx 4 your opinion

Danke an alle, die mir geholfen haben mit guten Links und Mühe (bronxxxx)!!!!

PS: Ich mache noch keinen Haken an das Thema, da ich irg. noch auf eine Antwort von dir warte.

mfg


----------



## Guest (19. Jan 2007)

Nur so als Hinweis:



> <password<istdashierwirklichdaspasswort?</password>



Das < am Ende von password ist flaschrum.


----------

