Nullpointer metody

Odpowiedz Nowy wątek
2019-08-12 21:35
0

Wywala mi tutaj Nullpointera dlaczego ? CHodzi mi o metody addEmployee

package PAkietSQL;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import domain.Employee;

public class Main {
private static EntityManager entityManager;
private static EntityManagerFactory entityManagerFactory;

    public static void main(String[] args) {
        EntityManagerFactory entityManagerFactory =Persistence.createEntityManagerFactory("myDataBase") ;
EntityManager entityManager = entityManagerFactory.createEntityManager();

addEmployees();

entityManager.close();
entityManagerFactory.close();
    }

private static void addEmployees() {
    addEmployee("Maciek","ss", 2000);
    addEmployee("Maciek","ss", 2000);
    addEmployee("Maciek","ss", 2000);
    addEmployee("Maciek","ss", 2000);
    addEmployee("Maciek","ss", 2000);
    addEmployee("Maciek","ss", 2000);
    addEmployee("Maciek","ss", 2000);
    addEmployee("Maciek","ss", 2000);
    addEmployee("Maciek","ss", 2000);
    addEmployee("Maciek","ss", 2000);
    addEmployee("Maciek","ss", 2000);

}

private static void addEmployee(String firstName,String lastName, double salary)
{
    Employee employee=new Employee();
    employee.setFirstName(firstName);
    employee.setLastName(lastName);
    employee.setSalary(salary);

    entityManager.getTransaction().begin();
    entityManager.persist(employee);
entityManager.getTransaction().commit();
edytowany 1x, ostatnio: kq, 2019-08-12 22:27

Pozostało 580 znaków

2019-08-12 22:26
0

Co jest tutaj nullem? entityManager?

Pozostało 580 znaków

2019-08-12 22:27
0

W metodzie main tworzysz nową zmienną lokalną entityManager zamiast przypisać to do pola klasy.

Pozostało 580 znaków

2019-08-12 22:54
0
radek1234 napisał(a):

W metodzie main tworzysz nową zmienną lokalną entityManager zamiast przypisać to do pola klasy.

ale dalej jest null

Exception in thread "main" java.lang.NullPointerException
at PAkietSQL.Main.addEmployee(Main.java:46)
at PAkietSQL.Main.addEmployees(Main.java:25)
at PAkietSQL.Main.main(Main.java:17)

pokaż jak poprawiłeś, bo dalej niewiele mówi - twonek 2019-08-12 22:58

Pozostało 580 znaków

2019-08-12 23:02
0
MrZiomenOmen napisał(a):
radek1234 napisał(a):

W metodzie main tworzysz nową zmienną lokalną entityManager zamiast przypisać to do pola klasy.

ale dalej jest null

Exception in thread "main" java.lang.NullPointerException
at PAkietSQL.Main.addEmployee(Main.java:46)
at PAkietSQL.Main.addEmployees(Main.java:25)
at PAkietSQL.Main.main(Main.java:17)

public static void main(String[] args) {

    EntityManagerFactory entityManagerFactory =Persistence.createEntityManagerFactory("myDataBase") ;

entityManagerFactory.createEntityManager();

addEmployees();

entityManager.close();
entityManagerFactory.close();

2019-08-12 23:08
0

Teraz w ogóle nie przypisujesz wartości z entityManagerFactory.createEntityManager();
powinno być:
entityManager = entityManagerFactory.createEntityManager();

Pozostało 580 znaków

2019-08-13 11:02
0

Spróbuj może używać obiektów i nie operuj na zmiennych i metodach statycznych.
Stwórz sobie np. klasę EmployeeRepository, która będzie miała metodę addEmployee().
Niech klasa EmployeeRepository ma pole EntityManager (najlepiej z modyfikatorem final) i wstrzykiwanie tej zależności odbywa się przez konstruktor. Wtedy nie dość, że kod będzie ładniej wyglądał, to jeszcze pomoże Ci to w uniknięciu takich dziwnych problemów.

Btw. to już bodajże 3. Twój post*, w którym masz problem z przypisywaniem i zasięgiem zmiennych. Może zerknij sobie na początek, na ten skrótowy wpis Java Variable Scope.


* Żeby nie być gołosłownym:

edytowany 1x, ostatnio: catom, 2019-08-13 11:03

Pozostało 580 znaków

2019-08-13 15:01
0
catom napisał(a):

Spróbuj może używać obiektów i nie operuj na zmiennych i metodach statycznych.
Stwórz sobie np. klasę EmployeeRepository, która będzie miała metodę addEmployee().
Niech klasa EmployeeRepository ma pole EntityManager (najlepiej z modyfikatorem final) i wstrzykiwanie tej zależności odbywa się przez konstruktor. Wtedy nie dość, że kod będzie ładniej wyglądał, to jeszcze pomoże Ci to w uniknięciu takich dziwnych problemów.

Btw. to już bodajże 3. Twój post*, w którym masz problem z przypisywaniem i zasięgiem zmiennych. Może zerknij sobie na początek, na ten skrótowy wpis Java Variable Scope.


* Żeby nie być gołosłownym:

Nie rozmumiem tego wstrzykiwania przez konstruktor znalazłem coś takiego ale po co mi to jest właściwie
public class Shop {

private ShoppingCard shoppingCard;

@Autowired
public Shop(ShoppingCard shoppingCard) {
    this.shoppingCard = shoppingCard;
}

public void purchase() {
    shoppingCard.addProductToShoppingCard(new Product(1, "Milk"));
    shoppingCard.addProductToShoppingCard(new Product(2, "Tea"));
    shoppingCard.addProductToShoppingCard(new Product(3, "Bread"));
}

Rozumiem jak mam konstruktoe Employee(name,age) itd to że moge sobie zrobić tak Employee("Jaś",2) ale co mi daje np Employee(Card card) ?

Pozostało 580 znaków

2019-08-13 16:10
0

Poprzez wstrzykiwanie przez konstruktor odnoszę się do jednej z technik programowania obiektowego - Dependency Injection - niekoniecznie z wykorzystaniem kontenerów i Inversion of Control.

Przykładowe źródła:

W Twoim przypadku, byłoby to:

public class EmployeeRepository {

  private final EntityManager entityManager;

  public EmployeeRepository(EntityManager entityManager) { // o tu jest wstrzykiwanie zależności przez konstruktor - EntityManager jest Twoją zależnością
    this.entityManager = entityManager;
  }

  public void addEmployee(Employee employee) {
    // tutaj dodanie employee do bazy poprzez wykorzystanie wstrzykniętego wcześniej EntityManagera
  }
}
edytowany 2x, ostatnio: catom, 2019-08-13 16:12
Czy DI zadziała jeżeli on nie ma w projekcie Springa? Chodzi mi o niejawne @Inject / @Autowired - Belka 2019-08-13 19:29
@Belka: Tu nie chodzi o kontener IoC tylko o DI jako o koncept. Dependency Injection, jako koncept, nie musi w ogóle mieć nic w spólnego z JEE, Springiem czy innym Guicem. - catom 2019-08-14 08:33

Pozostało 580 znaków

2019-08-13 16:31
0
catom napisał(a):

Poprzez wstrzykiwanie przez konstruktor odnoszę się do jednej z technik programowania obiektowego - Dependency Injection - niekoniecznie z wykorzystaniem kontenerów i Inversion of Control.

Przykładowe źródła:

W Twoim przypadku, byłoby to:


public class EmployeeRepository {

  private final EntityManager entityManager;

  public EmployeeRepository(EntityManager entityManager) { // o tu jest wstrzykiwanie zależności przez konstruktor - EntityManager jest Twoją zależnością

no dobra ale czym się to różni ? i po co mi to jest w konstruktorze w ogóle jak mam pole ?

this.entityManager = entityManager;

}

public void addEmployee(Employee employee) {
// tutaj dodanie employee do bazy poprzez wykorzystanie wstrzykniętego wcześniej EntityManagera
}
}

Pozostało 580 znaków

2019-08-13 18:51
0
catom napisał(a):

Poprzez wstrzykiwanie przez konstruktor odnoszę się do jednej z technik programowania obiektowego - Dependency Injection - niekoniecznie z wykorzystaniem kontenerów i Inversion of Control.

Przykładowe źródła:

W Twoim przypadku, byłoby to:

public class EmployeeRepository {

  private final EntityManager entityManager;

  public EmployeeRepository(EntityManager entityManager) { // o tu jest wstrzykiwanie zależności przez konstruktor - EntityManager jest Twoją zależnością
    this.entityManager = entityManager;
  }

  public void addEmployee(Employee employee) {
    // tutaj dodanie employee do bazy poprzez wykorzystanie wstrzykniętego wcześniej EntityManagera
  }
}

Rozumiem że ta metoda jest przeciążona ?

public void addEmployee(Employee employee) {

// tutaj dodanie employee do bazy poprzez wykorzystanie wstrzykniętego wcześniej EntityManagera

}

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0