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.

0

Witam ponownie, mam taki problem: zalozmy ze chce wykorzystac kod Koziołka (lekko zmodyfikowany) do zrobienia UPDATE: wczesniej dalem takie cos:

@Stateless(mappedName = "Ziarno")
@TransactionManagement(TransactionManagementType.BEAN)
public class Ziarno implements ZiarnoRemote 
{
	@PersistenceContext(unitName = "Ankieta", type = PersistenceContextType.TRANSACTION)
	private EntityManager en;
	
	@Resource
	private UserTransaction ut;

i chce zrobic UPDATE:

public boolean updateUser(User user) {
  try{
    en.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;
  }
}

PYTANIA:

  1. czy ma byc en.getTransaction().begin(); czy mzoe ut.begin() i ut.commit()?
  2. Do powyzszej procedury przesylany jest obiekt User, ktory ma byc aktualizowany - jak stworzyc taki obiekt - konkretny wiersz w tabeli user, jak znalezc dany wiersz? ktoś moze podac przyklad? No bo tworze:
    User user=new User();
    user.setId= - i tu problem bo chce zaktualizowac np usera o id=2...Jak to zrobic?
0
  1. Można oczywiście wyrzucić sobie transakcję do osobnej zmiennej (przy większym pisaniu nawet wskazane).
User userx = em.find(User.class, user.getUserId());

Zwraca usera o danym ID.

0
Koziołek napisał(a)
  1. Można oczywiście wyrzucić sobie transakcję do osobnej zmiennej (przy większym pisaniu nawet wskazane).
User userx = em.find(User.class, user.getUserId());

Zwraca usera o danym ID.

A napisalem cos takiego:

public boolean wstawPunkty(String idHasla, String idWykladowcy, String idPytania, int iloscPunktow)
	{
		Student student=en.find(Student.class, Integer.parseInt(idHasla));
		System.out.println("aaaa");
		Wykladowca wykladowca=en.find(Wykladowca.class, Integer.parseInt(idWykladowcy));
		Pytanie pytanie=en.find(Pytanie.class, Integer.parseInt(idPytania));
		
		Punkty punkty=new Punkty();
		//punkty.setIdPunktow(1);
		punkty.setStudent(student);
		punkty.setWykladowca(wykladowca);
		punkty.setPytanie(pytanie);
		punkty.setIloscPunktow(iloscPunktow);
		
		try
		{
			en.getTransaction().begin();
			en.persist(punkty);
			en.getTransaction().commit();
			return true;		
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return false;
		}
		finally
		{
			en.close();
		}
	}
	

I wywala blad:

javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
	java.rmi.RemoteException: null; nested exception is: 
	java.lang.IllegalStateException
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
	java.rmi.RemoteException: null; nested exception is: 
	java.lang.IllegalStateException
	at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.mapSystemException(Util.java:243)
	at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:205)
	at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152)
	at com.sun.corba.ee.impl.presentation.rmi.bcel.BCELStubBase.invoke(BCELStubBase.java:225)
	at session.__ZiarnoRemote_Remote_DynamicStub.wstawPunkty(session/__ZiarnoRemote_Remote_DynamicStub.java)
	at session._ZiarnoRemote_Wrapper.wstawPunkty(session/_ZiarnoRemote_Wrapper.java)
	at client.Klient.main(Klient.java:67)
Caused by: java.rmi.RemoteException: null; nested exception is: 
	java.lang.IllegalStateException
	at com.sun.enterprise.iiop.POAProtocolMgr.mapException(POAProtocolMgr.java:251)
	at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1411)
	at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
	at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:210)
	at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:117)
	at $Proxy55.wstawPunkty(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:154)
	at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:687)
	at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:227)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1846)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1706)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:1088)
	at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:223)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:806)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:563)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2567)
	at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)
Caused by: java.lang.IllegalStateException
	at com.sun.enterprise.util.EntityManagerWrapper.close(EntityManagerWrapper.java:1056)
	at session.Ziarno.wstawPunkty(Ziarno.java:285)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1011)
	at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:175)
	at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2920)
	at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4011)
	at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:203)
	... 17 more
javax.ejb.EJBException: nested exception is: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
	java.rmi.RemoteException: null; nested exception is: 
	java.lang.IllegalStateException
	at session._ZiarnoRemote_Wrapper.wstawPunkty(session/_ZiarnoRemote_Wrapper.java)
	at client.Klient.main(Klient.java:67)

Co jest nie tak? Bo mam tabele Punkty, ktora ma duzo kluczy obcych - jak mozna uzupelnic dana kolumne bedaca kluczem obcym skoro w Entity tabela Punkty np nie ma pola mapowanego idPytania tylko Pytanie (jako obiekt)...

0

Na czuja... spróbuj otoczyć całą operację transakcją (łącznie z wyborem Studenta i pytania)... lub też uzyskiwać oddzielne EntityManagery dla poszczególnych kroków.

0
Koziołek napisał(a)

Na czuja... spróbuj otoczyć całą operację transakcją (łącznie z wyborem Studenta i pytania)... lub też uzyskiwać oddzielne EntityManagery dla poszczególnych kroków.

Drogi Koziołku - nie wiem jak to robisz, ale wszystko co mówisz jest błogosławieństwem! Masz wielką moc!

A tak przy okazji małe pytanko - w Oraclu zrobilem sekwencje i triggery (automatyczne wstawianie id) - zauwazyłem, ze jak nie wpisze user.setid to wstawia mi wiersz o id=0...Jak to obejść tak profesjonalnie?

0
  1. Co robię... jak przywróci mi się hosting to na moim blogu jest gdzieś CV. Tam napisane dość dokładnie co ostatnio porabiam.

  2. Z Oraclem nie miałem do czynienia za dużo (kurs admina dopiero w maju), ale lepszą metodą jest wygenerowanie bazy danych za pomocą dostawcy JPA. To co zrobiłeś jest raczej dobre w przypadku gdy np. chcesz znakować czasem. Moim zdaniem jednak masz błąd w triggerach. Najprawdopodobniej nie aktualizujesz sekwencji.

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