# persisitieren von Objekten



## dadom110 (13. Feb 2008)

HuHu,

irgendwie klappt meine Kommunikation mit der Persistenzschicht nicht, bekomme meine EntityManager zugewiesen, bin wie folgt vorgegangen, hoffe jemand hat ein wenig Zeit um das mal durchzugehen 

Benutze:

Eclipse Europe
GlassFish Application Server.
Standard Derby Datenbank

1. in Eclipse Dynamisch Web Project angelegt (JSP Seiten etc. laufen alle)
2. Java Klasse erzeugt mit Annotation "Entity" (gleicher Name wie in der Datenbank)
3. persistence.xml angelegt:


```
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
    <persistence-unit name="default">
        <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>
        <class>dd.ReminderDate</class>
        <properties>
            <property name="toplink.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
            <property name="toplink.jdbc.url" value="jdbc:derby:C:\DerbyDatabases\DTest"/>
            <property name="toplink.jdbc.user" value="admin"/>
            <property name="toplink.jdbc.password" value="adminadmin"/>
            <property name="toplink.logging.level" value="INFO"/>
        </properties>
    </persistence-unit>
</persistence>
```

= eclispe kann "einigermaßen" zu der DB connecten, sehe meine angelegten Tables nicht, aber weiss nicht ob das ein Bug in dem komischen Eclipse Data Explorer ist.

4. Aufruf in einer JSP


```
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="javax.persistence.EntityManager"%>
<%@page import="dd.entities.ReminderDate"%>
<%@page import="java.sql.Date"%>
<%@page import="java.sql.Time"%>
<%@page import="javax.persistence.EntityTransaction"%>
<%@page import="javax.persistence.EntityManagerFactory"%>
<%@page import="javax.persistence.Persistence"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
	//MockCode:
	//Die Klasse die ich angelegt habe mit entsprechender Datenbanktabelle:
	ReminderDate mockDate=new ReminderDate();
	mockDate.setStartdate(new Date(2008,03,01));
	mockDate.setEnddate(new Date(2008,03,01));
	mockDate.setStarttime(new Time(15,00,00));
	mockDate.setEndtime(new Time(15,30,00));
	mockDate.setDescription("Ich bin ein kleines Beispiel fuer de Persistenz");
	mockDate.setLabel("MockM3");
	

	EntityManagerFactory emFactory=Persistence.createEntityManagerFactory("default");
	EntityManager emf=emFactory.createEntityManager();
	
	EntityTransaction transaction=emf.getTransaction();
	transaction.begin();
	
	emf.persist(mockDate);
	
	transaction.commit();
	emf.close();
	
%>

</body>
</html>
```

Bekomme einen Fehler:


```
Servlet.service() for servlet jsp threw exceptionjava.lang.NullPointerException	
at oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider.createEntityManagerFactory(EntityManagerFactoryProvider.java:120) 
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:83)	
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60)	
at org.apache.jsp.index_jsp._jspService(index_jsp.java:85)	
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)	
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)	
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:353)	
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:412)	
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:318)	
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)	
at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:397)	
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:278)	
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:566)	
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:536)	
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:240)	
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:179)	
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:566)	
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:73)	
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:182)	
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:566)	
at com.sun.enterprise.web.VirtualServerPipeline.invoke(VirtualServerPipeline.java:120)	
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:939)	
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:137)	
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:566)	
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:536)	
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:939)	
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:239)	
at com.sun.enterprise.web.connector.grizzly.ProcessorTask.invokeAdapter(ProcessorTask.java:667)	
at com.sun.enterprise.web.connector.grizzly.ProcessorTask.processNonBlocked(ProcessorTask.java:574)	
at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:844)	
at com.sun.enterprise.web.connector.grizzly.ReadTask.executeProcessorTask(ReadTask.java:287)	
at com.sun.enterprise.web.connector.grizzly.ReadTask.doTask(ReadTask.java:212)	
at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:252)	
at com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:75)
```

danke schon mal !!!!
Dom

_[Edit by Beni: das Layout gerettet, benutz das nächste mal bitte die *Vorschau*]_


----------



## eliot (13. Feb 2008)

Hallo,

ich würde micht deiner Frage gliech anschließen,
auch bei mir ist es einfach nicht möglich einen EntityManger zu bekommen.

Hier mal mein Code:

Die Facade:


```
package de.nordsys.facades;

import de.nordsys.Benutzer;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;



/**
 *
 * @author geisler
 */
@Stateless
public class BenutzerFacade implements BenutzerFacadeLocal {
    @PersistenceContext
    private EntityManager em;

    public void create(Benutzer benutzer) {
        if(em!=null)
            em.persist(benutzer);
        else
            System.out.println("******************* EM ist null! ***********************");
    }

    public void edit(Benutzer benutzer) {
        em.merge(benutzer);
    }

    public void remove(Benutzer benutzer) {
        em.remove(em.merge(benutzer));
    }

    public Benutzer find(Object id) {
        return em.find(de.nordsys.Benutzer.class, id);
    }

    public List<Benutzer> findAll() {
        return em.createQuery("select object(o) from Benutzer as o").getResultList();
    }

}
```

Die Bean dazu:


```
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
 *
 * @author geisler
 */
@Entity
public class Benutzer implements Serializable {
    private static final long serialVersionUID = 1L;
    private Long id;
    private String login, password;

    public Benutzer(String login, String password) {
        this.login = login;
        this.password = password;
    }

    public Benutzer() {
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
    

    public void setId(Long id) {
        this.id = id;
    }

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getId() {
        return id;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Benutzer)) {
            return false;
        }
        Benutzer other = (Benutzer) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "de.nordsys.Benutzer[id=" + id + "]";
    }

}
```

Und die einfache JSP Seite dazu:


```
<jsp:useBean id="benutzer" class="de.nordsys.Benutzer"/>
<jsp:useBean id="summe" class="de.nordsys.facades.CalculatorBean"/>
<%@ page import="de.nordsys.facades.BenutzerFacade" %>
<%@ page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
       <%
       benutzer.setLogin(request.getParameter("benutzer"));
       benutzer.setPassword(request.getParameter("pass"));
       out.print("

Hallo "+benutzer.getLogin()+"</p>
");
       BenutzerFacade benutzerFacade = new BenutzerFacade();
       benutzerFacade.create(benutzer);
       int ergebnis = summe.summe(10, 20);
       out.print("Die Summe lautet: "+ergebnis);
       %>
    </body>
</html>
```

Der Zugriff auf alle anderen Beans geht hervorragen, nur das Persistieren mit dem
Entity Manager schlägt leider fehl, da der em == null ist.

regards

eliot


----------



## Guest (13. Feb 2008)

Was passiert, wenn du "oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider" 
durch das hier ersetzts "oracle.toplink.essentials.PersistenceProvider"

@eliot
Namen der PersistenceUnit vergessen?
	
	
	
	





```
@PersistenceContext(unitName = "default") // am Beispiel des Namens, den dadom110 gewählt hat
```


----------



## eliot (14. Feb 2008)

Anonymous hat gesagt.:
			
		

> Was passiert, wenn du "oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider"
> durch das hier ersetzts "oracle.toplink.essentials.PersistenceProvider"
> 
> @eliot
> ...



Hallo,

ledier hat der unitName nichts gebracht, der EntityManager ist immer noch null.

Hier mal der output von Glassfish nach dem deployen:


```
CORE5022: All ejb(s) of [TestEjbLogin] were unloaded successfully!
Caught a Throwable in dropTables: java.lang.NullPointerException
TopLink, version: Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))
Server: unknown
file:/home/geisler/work/projects/NetBeans/TestEjbLogin/dist/gfdeploy/TestEjbLogin-ejb_jar/-TestEjbLogin-ejbPU login successful
file:/home/geisler/work/projects/NetBeans/TestEjbLogin/dist/gfdeploy/TestEjbLogin-ejb_jar/-TestEjbLogin-ejbPU logout successful
JDO76609: Got SQLException executing statement "CREATE TABLE SEQUENCE (SEQ_NAME VARCHAR(50) NOT NULL, SEQ_COUNT DECIMAL(38), PRIMARY KEY (SEQ_NAME))": org.postgresql.util.PSQLException: ERROR: relation "sequence" already exists
JDO76609: Got SQLException executing statement "INSERT INTO SEQUENCE(SEQ_NAME, SEQ_COUNT) values ('SEQ_GEN', 1)": org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "sequence_pkey"
deployed with moduleid = TestEjbLogin
naming.bind
LDR5010: All ejb(s) of [TestEjbLogin] loaded successfully!
```

Als Datenbank kommt Postgres zum Einsatz, der Table wird auch korrekt in der richtigen Datenbank
angelegt.

Das Projekt ist in NetBeans. Muss sowohl das EJB als auch das WAR Projekt jeweils einen 
Persistence-xml haben?

regards

eliot


----------



## eliot (18. Feb 2008)

Hallo,

leider habe ich es níimernoch nicht geschafft,
deshalb stelle ich mal ein kleines NetBeans 6 Projekt online,
welches mein Problem gut darstellt.
Es besteht aus JSP Pages und einem Entity, welches
über eine Facade gespeichert werden soll.

Hier der Link:

public.fh-wolfenbuettel.de/~geislera/TestEjbLogin.tar.gz

Vielleicht hilft das, wäre echt toll
wenn ihr mal kurz reinschauen würdet, bin mittlerweile echt verzweifelt.

Danke!

EDIT:

Hier mal die Benutzer Facade:

```
@PersistenceContext (name="blbb" ,unitName="TestEjbLoginPU")
@Stateless
public class BenutzerFacade implements BenutzerFacadeLocal {

private EntityManager em;

public BenutzerFacade(){
em = getEntityManager();
}

public String create(Benutzer benutzer) {
if(em!=null){
em.persist(benutzer);
return "Gepseichert!";
}
else{
System.out.println("******************* EM ist null! ***********************");
return "Nicht gespeichert!";
}
}

public void edit(Benutzer benutzer) {
em.merge(benutzer);
}

public void remove(Benutzer benutzer) {
em.remove(em.merge(benutzer));
}

public Benutzer find(Object id) {
return em.find(de.nordsys.Benutzer.class, id);
}

public List<Benutzer> findAll() {
return em.createQuery("select object(o) from Benutzer as o").getResultList();
}

private EntityManager getEntityManager(){
try{
InitialContext ic = new InitialContext();
EntityManager em = (EntityManager) ic.lookup("java:comp/env/blbb");
System.out.println("****************************** EM ist ungleich null!");
return em;
}catch(Exception e){

System.out.println("***********************Em ist null!");
System.out.println(e.toString());
return null;
}
}

}
```

Beim Anlegen einer neuen BenutzerFacade Instanz,
bekomne ich folgenden Fehler im Glassfish:


```
LDR5010: All ejb(s) of [TestEjbLogin] loaded successfully!
***********************Em ist null!
javax.naming.NameNotFoundException: No object bound to name java:comp/env/blbb
******************* EM ist null! ***********************
```
regards

eliot


----------



## Gast (19. Feb 2008)

bau den vorher Context auf ...

	emf = Persistence.createEntityManagerFactory("default"); 		
		threadLocal = new ThreadLocal<EntityManager>();
		logger = Logger.getLogger("default");
		logger.setLevel(Level.ALL);


----------



## eliot (21. Feb 2008)

Hallo,

ich habe es jetzt anders gelöst.
Ich nutze einfach ein Serlet oder Portlet um auf die Datenbank
zuzugreifen.
Aus einer JSP hat das leider nicht funktioniert.

Danke für eure Hilfe!

regards

eliot


----------

