EJB 3.0 - UPDATE

0

Witam, chce w EJB 3.0 zrobic UPDATE - mam taki kod:

Query updt=en.createQuery("update Wykladowca w set w.nazwiskoWykl='Kasperoza' where w.imieWykl=:imie");
             updt.setParameter("imie", "Andrzej");
             updt.executeUpdate();

Kod oczywiście nie dziala, wywala blad:

Exception in thread "main" java.lang.NullPointerException
    at client.Klient.main(Klient.java:34)

ktoś wie o co chodzi? Nazwy w zapytaniu to oczywiscie nie nazwy kolumn w bazie tylko nazwy "kolumn" wystepujace w encjach

0

Czy musi być koniecznie przez Query?
Moim skromnym zdaniem lepsza metoda:

public boolean updateUser(User user) {
  EntityManager em = getEntityManager();
  try{
    em.getTransaction().begin();
    User userx = em.find(User.class, user.getUserId());
    userx.setUserName(user.getUserName()); 
    userx.setPasswd(user.getPasswd());
    userx.setEmailAddress(user.getEmailAddress());
    em.getTransaction().commit();
  } finally {
    em.close();
    return false;
  }
}

W tym przypadku to zadaniem JPA będzie stworzenie odpowiedniego zapytania.

0

No dobrze, a jak będę chciał wykonać bardziej skomplikowane wyszukiwanie albo delete albo insert? Wtedy chyba lepiej użyć zapytania...

0

poczytaj o Criteria API

0

Insert i delete są bardzo, bardzo proste:

public boolean insertUser(User user) {
  EntityManager em = getEntityManager();
  try{
    em.getTransaction().begin();
    em.persist(user);
    em.getTransaction().commit();
    return true;
  } finally {
    em.close();
    return false;
  }
}
public boolean removeUser(Users user) {
  EntityManager em = getEntityManager();
  try{
    em.getTransaction().begin();
    Users userx = em.find(Users.class, user.getUserId());
    em.remove(userx); 
    em.getTransaction().commit();
  } finally {
    em.close();
    return false;
  }
}

Jedynie wyszukiwanie wymaga pisania czegokolwiek z palucha.

0

Dzięki wielkie Koziołek - na Ciebie zawsze mozna liczyc...Dzięki - jutro zaczne ostro działać

0

A ja mam takie pytanie do koziolka.
Dlaczego w swoich przykladach uzywaszEntityManager em = getEntityManager()
zamiast wstrzykiwania zasobow

@PersistenceContext
EntityManager em;

?

0

@folly, dla uproszczenia. W Aplikacji SE bez Springa nie zrobisz DI, podobnie w aplikacji webowej bez wspomagaczy w postaci Springa nie zrobisz DI. W przypadku Weba wynika to z tego, że servlety są multi-thread, a EntityManager w ogólności nie jest threadsafe.

0
Koziołek napisał(a)

W Aplikacji SE bez Springa nie zrobisz DI, podobnie w aplikacji webowej bez wspomagaczy w postaci Springa nie zrobisz DI

Poranna dawka czepialstwa - to tylko Spring jest konrenerem DI? Ja znam jeszcze inne: plexus, guice, pico container, hive mind... ;-P
Pozdro.

0

@::, wiem że są inne kontenery. Jednak mało kto ich używa.

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