NPE beim Persistieren einer Entität

Dieses Thema NPE beim Persistieren einer Entität im Forum "Data Tier" wurde erstellt von Raphalon, 19. Jan. 2013.

Thema: NPE beim Persistieren einer Entität Beim Persistieren eines neues Customer wird eine NPE geworfen und ich finde den Grund nicht. Warum wird hier...

  1. Beim Persistieren eines neues Customer wird eine NPE geworfen und ich finde den Grund nicht. Warum wird hier toString aufgerufen? Wenn ich im Customer das "getId()" aus der toString()-Methode nehme, dann geht es. Aber das kann nicht die Ursache des Problems sein.

    Code (Java):
     
    Code (Java):
    package de.org.grp.back;

    import de.org.grp.domain.Customer;
    import de.org.grp.sl.CustomerService;
    import javax.enterprise.inject.Model;
    import javax.inject.Inject;
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;
    import java.util.Collection;

    @Model
    public class Initializer {

        @Inject
        CustomerService custService;

        public void executeCustomerActivities() {
            Customer customer = null;
            customer = custService.createCustomer("Michael Green", 54321);
    }
    Code (Java):

    package de.org.grp.sl;
    import de.org.grp.domain.Customer;
    import javax.ejb.Stateless;
    import javax.inject.Inject;
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import javax.persistence.Query;
    import java.util.Collection;

    @Stateless
    public class CustomerService {

        @PersistenceContext(unitName = "CustomerService")
        private EntityManager em;

        public Customer createCustomer(String name, long salary) {
            Customer customer = new Customer();
            customer.setName(name);
            customer.setSalary(salary);
            em.persist(customer);
            return customer;
        }

    }
    [XML]<persistence-unit name="CustomerService" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>jdbc/DerbyJPACertDB</jta-data-source>
    <properties>
    <property name="eclipselink.target-server" value="SunAS9"/>
    <property name="eclipselink.target-database"
    value="org.eclipse.persistence.platform.database.DerbyPlatform"/>
    <property name="eclipselink.logging.level" value="ALL"/>
    <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
    <property name="eclipselink.ddl-generation.output-mode" value="both"/>
    </properties>
    </persistence-unit>
    </persistence>[/XML]
     
  2. Vielleicht hilft dir das Grundlagen Training weiter --> *Klick*
  3. Wie sieht die Methode getId () aus?
     
  4. Vermutlich ist die ID null und durch dein Format-Pattern wird versucht null als (int) zu behandeln, was wiederum beu null zu einer NPE führt
     
  5. Die Entität Customer sieht folgendermaßen aus.

    Code (Java):
    package de.org.grp.domain;
    import javax.persistence.*;
    import java.io.Serializable;

    @Entity
    @NamedQuery(name = "findCustomerByName",
            query = "SELECT c FROM Customer c WHERE c.name = :nameParam")
    public class Customer implements Serializable {

        @Id
        @TableGenerator(name="CustIdGen",
                table="ID_CUSTOMER",
                pkColumnName="GEN_NAME",
                valueColumnName="GEN_VAL")
        @GeneratedValue(generator="CustIdGen")
        private Long id;

        @Column
        private String name;

        @Column
        private long salary;

        public Customer() { }

        public long getId() {
            return id;
        }
        public void setId(long id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public long getSalary() {
            return salary;
        }
        public void setSalary(long salary) {
            this.salary = salary;
        }
        @Override
        public String toString() {
            return "Customer id: " + getId() + " name: " + getName() + " salary: " + getSalary();
        }
    }
     
  6. Sym
    Sym
    Deine Getter/Setter sollen mit Long und nicht mit long arbeiten.
     
  7. Ja, mit Long läuft es. Kannst Du mir noch erläutern, warum ein Primitive an dieser Stelle einen solchen Fehler hervorruft?
     
    Zuletzt bearbeitet: 20. Jan. 2013
  8. ID istvom Typ Long, der getter vom Typ long. Dadurch findet ein Ato-Unboxing statt, wass bei ID=null. zu einer NPE führt
     
  9. Kostenloses Java-Grundlagen Training im Wert von 39 €
    Schau dir jetzt hier das Tutorial an und starte richtig durch!