EclipseLink Maven Beispiel erzeugt Fehler

Ich habe mal testweise ein kleines Maven EclipseLink für MySQL Beispiel mit Netbeans geschrieben.

pom.xml
[XML]

<?xml version="1.0" encoding="UTF-8"?> 4.0.0 EclipseLinkDemo EclipseLinkDemo 1.0-SNAPSHOT jar org.eclipse.persistence eclipselink 2.5.2 org.eclipse.persistence org.eclipse.persistence.jpa.modelgen.processor 2.5.2 provided UTF-8 1.7 1.7 [/XML]

persistence.xml
[XML]

<?xml version="1.0" encoding="UTF-8"?> org.eclipse.persistence.jpa.PersistenceProvider eclipselinkdemo.eclipselinkdemo.entity.User [/XML]

Die Verbindungsdaten stimmen. Die Datenbank läuft und folgende Tabelle befindet sich in der Datenbank „eclipselinkdb“

user
[SQL]
CREATE TABLE IF NOT EXISTS user (
id int(11) NOT NULL,
firstname varchar(255) NOT NULL,
lastname varchar(255) NOT NULL,
email varchar(255) NOT NULL,
password varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
[/SQL]

Die dazugehörige Entity sieht wie folgt aus

package eclipselinkdemo.eclipselinkdemo.entity;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Entity
@Table(name = "user")
@NamedQueries({
    @NamedQuery(name = "User.findAll", query = "SELECT u FROM User u")})
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @Basic(optional = false)
    @Column(name = "firstname")
    private String firstname;
    @Basic(optional = false)
    @Column(name = "lastname")
    private String lastname;
    @Basic(optional = false)
    @Column(name = "email")
    private String email;
    @Basic(optional = false)
    @Column(name = "password")
    private String password;

    public User() {
    }

    public User(Integer id) {
        this.id = id;
    }

    public User(Integer id, String firstname, String lastname, String email, String password) {
        this.id = id;
        this.firstname = firstname;
        this.lastname = lastname;
        this.email = email;
        this.password = password;
    }

    public Integer getId() {
        return id;
    }

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

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

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

    @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 User)) {
            return false;
        }
        User other = (User) 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 "eclipselinkdemo.eclipselinkdemo.entity.User[ id=" + id + " ]";
    }
    
}

Die DAO sieht wie folgt aus

package eclipselinkdemo.eclipselinkdemo.dao;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import eclipselinkdemo.eclipselinkdemo.entity.User;

public class UserDAO {
       @PersistenceContext
       protected EntityManager em;
       
       public User create(final User user) {
                this.em.persist(user);
                return user;
       }
}

Die Mainklasse sieht wie folgt aus

package eclipselinkdemo.eclipselinkdemo;

import eclipselinkdemo.eclipselinkdemo.dao.UserDAO;
import eclipselinkdemo.eclipselinkdemo.entity.User;

public class EclipseLink {
       public static void main(String[] args) {
              UserDAO dao  = new UserDAO();
              User    user = new User();
              
              user.setFirstname("Roy");
              user.setLastname("Sinner");
              user.setEmail("test@test.com");
              user.setPassword("mypasswod");
              
              dao.create(user);
       }
}

Beim Ausführen erhalte ich folgende Fehlermeldung

cd D:\projekte\java
etbeans\EclipseLinkDemo; „JAVA_HOME=C:\Program Files\Java\jdk1.8.0_31“ cmd /c „""D:\Programme\Netbeans\8.0.2\java\maven\bin\mvn.bat" -Dexec.args="-classpath %classpath eclipselinkdemo.eclipselinkdemo.EclipseLink" -Dexec.executable="C:\Program Files\Java\jdk1.8.0_31\bin\java.exe" -Dmaven.ext.class.path=D:\Programme\Netbeans\8.0.2\java\maven-nblib
etbeans-eventspy.jar -Dfile.encoding=UTF-8 process-classes org.codehaus.mojo:exec-maven-plugin:1.2.1:exec"“
Scanning for projects…


Building EclipseLinkDemo 1.0-SNAPSHOT

— maven-resources-plugin:2.5:resources (default-resources) @ EclipseLinkDemo —
[debug] execute contextualize
Using ‚UTF-8‘ encoding to copy filtered resources.
Copying 1 resource

— maven-compiler-plugin:2.3.2:compile (default-compile) @ EclipseLinkDemo —
Compiling 3 source files to D:\projekte\java
etbeans\EclipseLinkDemo arget\classes

— exec-maven-plugin:1.2.1:exec (default-cli) @ EclipseLinkDemo —
Exception in thread „main“ java.lang.NullPointerException
at eclipselinkdemo.eclipselinkdemo.dao.UserDAO.create(UserDAO.java:21)
at eclipselinkdemo.eclipselinkdemo.EclipseLink.main(EclipseLink.java:25)

BUILD FAILURE

Total time: 8.702s
Finished at: Sun May 10 02:53:51 CEST 2015
Final Memory: 17M/113M

Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.2.1:exec (default-cli) on project EclipseLinkDemo: Command execution failed. Process exited with an error: 1 (Exit value: 1) → [Help 1]

To see the full stack trace of the errors, re-run Maven with the -e switch.
Re-run Maven using the -X switch to enable full debug logging.

For more information about the errors and possible solutions, please read the following articles:
[Help 1] MojoExecutionException - Apache Maven - Apache Software Foundation

Der Fehler wird anscheinend in der Zeile

this.em.persist(user);

der create - Funktion der UserDAO - Klasse ausgeführt. Irgendetwas scheine ich hier übersehen zu haben. Korregiert mich wenn ich falsch liege. Durch @PersistenceContext in der Klasse wird die protected EntityManager em; doch instanziert, oder? Was müsste ich ggf. anders machen?

Danke für eure Hilfe im voraus.

Für JPA musst Du irgendeinen Container starten. Einfach die jar ausführen wird hier nicht funktionieren.

Verstehe nicht ganz was du meinst. Könntest du mir dies bitte kurz erklären was du meinst oder einen link posten?

Ein Injection-Framework benötigt immer einen Container, in dem es läuft. Sonst können Injections nicht aufgelöst werden. Du benötigst also für das @PersistenceContext etwas, das damit zur Laufzeit umgehen kann. Im Webbereich übernimmt dies in der Regel ein Applicationserver, wie z.B. ein Wildfly.

Du kannst es aber auch einfach als Standalone benutzen also ohne einen EntityManager zu injecten.
Dann funktioniert das ganze auch ohne einen Container :wink:

Bsp: JPA 2.0 with EclipseLink - Tutorial

Hier solltest du dir u.a. genauer :

....
private static EntityManagerFactory factory;

  public static void main(String[] args) {
    factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
    EntityManager em = factory.createEntityManager();
....```

anschauen.