TransactionRequiredException dla Hibernate JPA przy próbie update tabeli bazy danych MySQL

0

Witam,

Mam uprzejma prośbę o pomoc w poniższym :

wykonuje update na bd jak wyżej w (JSF 2.2 Wildlfy 12.0) na prostej tabeli, reprezentującej stan aktywacji użytkowników systemu :

mysql> select * from signatories_activation;
+----+-----------+
| id | activated |
+----+-----------+
| 1 | N |
| 2 | N |
| 3 | N |
| 4 | N |
| 5 | N |
| 6 | N |
| 7 | N |
+----+-----------+
7 rows in set (0.00 sec)

Zapisuje nowe dane do w.wym tabeli bez problemu -nie zwracane są wyjątki.

Kod bezpośredni metody w klasie wykonawczej jest następujący :

  • gdzie :
  • idField = "id" nazwa pola z encji klasy JPA
  • fieldToUpdate = "activated" nazwa pola z encji klasy JPA
  • actualId = wartość pola id typu long odczytana z metody pobierającej zawartość wiersza tabeli html wyświetlającej zestaw rekordów z bazy danych
  • actualState = wartość pola "activated" typu String odczytana z metody pobierającej zawartość wiersza tabeli html wyświetlającej zestaw rekordów z
    bazy danych
  • classString = nazwa klasy encji JPA /stringowa/
  • em = referencja do EntityManager-a deklarowanego w klasie DAO

public void switchSignatoryStatus(String idField, String fieldToUpdate,long actualId, String actualState,String classString,EntityManager em)

{

    String hql="update "+classString+" set "+fieldToUpdate+"=:newState where "+idField+"=:id";

    
                    logger.log(Level.INFO, "Update SQL wynosi :"+actualId+": "+actualState+" do select SQL = :"+hql);

    
    Query query = em.createQuery(hql);

    query.setParameter("newState", actualState);

    query.setParameter("id", actualId);


    try {

        query.executeUpdate();

                    logger.log(Level.INFO, "Zmieniono status dla rekordu o id = "+actualId+" na :"+actualState);

    }
    catch(Exception e)
     {
                     logger.log(Level.INFO, "Nie można wykonać update :"+e);
        
                     e.printStackTrace();
    }
    
}

Niestety próba updatu konczy sie wyjątkiem jak niżej :
wydaje się , że sam select MYSQL jest w porządku, więc czegoś z pewnością musi brakować = coś muszę robić nie tak jak trzeba:

2018-08-03 2322,069 INFO [stdout] (default task-3) Hibernate: /* select generatedAlias0 from UserActivation as generatedAlias0 */ select useractiva0_.id as id1_1_, useractiva0_.activated as activate2_1_ from signatories_activation useractiva0_

2018-08-03 2322,080 INFO [stdout] (default task-3) Hibernate: /* select generatedAlias0 from Student as generatedAlias0 */ select student0_.id as id1_0_, student0_.apartment_number as apartmen2_0_, student0_.city as city3_0_, student0_.county as county4_0_, student0_.identity_card as identity5_0_, student0_.email as email6_0_, student0_.first_name as first_na7_0_, student0_.gender as gender8_0_, student0_.house_number as house_nu9_0_, student0_.iban_account as iban_ac10_0_, student0_.last_name as last_na11_0_, student0_.login as login12_0_, student0_.password as passwor13_0_, student0_.personal_id as persona14_0_, student0_.phone as phone15_0_, student0_.zip_code as zip_cod16_0_, student0_.prefix as prefix17_0_, student0_.signatories_activation_id as signato18_0_, student0_.street as street19_0_, student0_.voivodeship as voivode20_0_ from signatories student0_

2018-08-03 2323,469 INFO [org.primefaces.showcase.view.data.datatable.SignEditView] (default task-5) Wartość klikniętego rekordu wynosi :2 : N
2018-08-03 2323,469 INFO [org.primefaces.showcase.view.data.datatable.SignEditView] (default task-5) Update SQL wynosi N do
select SQL = :update UserActivation set activated=:newState where id=:id
2018-08-03 2323,469 INFO [org.primefaces.showcase.view.data.datatable.SignEditView] (default task-5) Nie można wykonać update :javax.persistence.TransactionRequiredException: Executing an update/delete query
2018-08-03 2323,469 ERROR [stderr] (default task-5) javax.persistence.TransactionRequiredException: Executing an update/delete query

i poniżej :

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.hibernate.jpa.spi.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:54)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.jboss.as.jpa.container.QueryNonTxInvocationDetacher.executeUpdate(QueryNonTxInvocationDetacher.java:80)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.primefaces.showcase.view.data.datatable.SignEditView.switchSignatoryStatus(SignEditView.java:184)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.primefaces.showcase.view.data.datatable.SignEditView.onRowSelect(SignEditView.java:148)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at java.lang.reflect.Method.invoke(Method.java:498)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at com.sun.el.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:181)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at com.sun.el.parser.AstValue.invoke(AstValue.java:289)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.jboss.weld.module.web.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.jboss.weld.module.web.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.jboss.weld.module.web.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.jboss.weld.module.web.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.primefaces.behavior.ajax.AjaxBehaviorListenerImpl.processArgListener(AjaxBehaviorListenerImpl.java:80)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.primefaces.behavior.ajax.AjaxBehaviorListenerImpl.processAjaxBehavior(AjaxBehaviorListenerImpl.java:64)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.primefaces.event.AbstractAjaxBehaviorEvent.processListener(AbstractAjaxBehaviorEvent.java:38)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at javax.faces.component.behavior.BehaviorBase.broadcast(BehaviorBase.java:106)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:805)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at javax.faces.component.UIData.broadcast(UIData.java:1086)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at javax.faces.component.UIData.broadcast(UIData.java:1108)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:67)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1526)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1526)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1526)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1526)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1526)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.server.Connectors.executeRootHandler(Connectors.java:360)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378)

2018-08-03 2330,570 ERROR [stderr] (default task-5) at java.lang.Thread.run(Thread.java:748)

Z góry dzięki za czas poświęcony.....

1
  1. Widać, że JPA/Hibernate Ci przeszkadza. Może lepiej użyć czehoś innego? (Hint: prawie wszystkim przeszkadza)
  2. Problem, masz przecież podany. Brak transakcji. Jak tą transakcję todać? Najdziwniej to przez dodanie adnotacji transactional na metodzie, ale czy zadziała to zależy od budowy twohjej aplikacji.
    To Spring,Ejb?, ta metoda jest w beanie? Jak ją wywołujesz?
0

Aplikacja jest w EJB , szkielet wygenerowany z archetypu Maven, serwer Wildlfy 12.0, Java 1.6, Intelij IDEA.

Metoda update jest w beanie :

@ManagedBean(name="dtSignEditView")
@ViewScoped
public class SignEditView extends Student implements Serializable {...itd.

Wywołuję ją nastepująco :

  1. strona xhtml zawiera tabelę z bazy danych MySQL , gdzie wierszami są rekordy użytkowników (dane personalne oraz stan aktywacji)

  2. stan aktywacji przechowuję w tabeli jak wyżej w wątku - encja JPA UserActivation

  3. po zmianie atrybutu na wierszu tabeli z N -nieaktywy na Y - aktywny, klikam na wiersz celem zatwierdzenia w bazie danych.

  4. wywołana zostaje metoda dla tabel z PrimeFaces : OnRowSelect , z której przechwytuję 'id' oraz 'activated' dla obiektu w encji UserActivation
    który chcę zmodyfikować w bazie danych

  5. EntityManagera pobieram getterem poprzez interfejs z klasy abstrakcyjnej na podstawie adnotacji :

public EntityManager getEntityManager() {
return entityManager;
}

public void setEntityManager(EntityManager entityManager) {
    this.entityManager = entityManager;
}

@PersistenceContext(unitName = "JakasTam")
protected EntityManager entityManager;

teraz jeśli zamienię kod w instrukcjach update-u i wprowadzę transakcję :

Query query = em.createQuery(hql);

    query.setParameter("newState", actualState);

    query.setParameter("id", actualId);

    try {

        em.getTransaction().begin();
        query.executeUpdate();
        em.getTransaction().commit();
        em.flush();

        logger.log(Level.INFO, "Zmieniono status dla rekordu o id = "+actualId+" na :"+actualState);

    }
    catch(Exception e)
     {
         logger.log(Level.INFO, "Nie można wykonać update :"+e);

         e.printStackTrace();
    }

..to zwraca wyjątek :

INFO [org.primefaces.showcase.view.data.datatable.SignEditView] (default task-7) Nie można wykonać update :java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction()
2018-08-04 1237,470 ERROR [stderr] (default task-7) java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction()
****

?

1

Musisz skorzystać z automatu EE generującego transakcje, nie możesz ich ręcznie tworzyć. Przypuszczam, że pobierasz EM w niewłaściwy sposób. Nie możesz go wstrzyknąć bezpośrednio do klasy, w której wykonujesz ten kod update?

Zastanów się jakie masz różnice pomiędzy kodem który działa (insert), a kodem, który nie działa (update). To czy robisz insert czy update jest bez znaczenia, ale może sposób pobierania Entity Managera (zależności między klasami między którymi przekazujesz tego managera) robi tę różnicę.

Gdybyś miał klasę typu repository, to tam byłby wstrzykiwany EM, tam byłby kod pracujący na bazie i nie powinno być żadnych problemów. Zgodnie z zasadą enkapsulacji.

2

A może tak?

UserTransaction utx = ... ;    // zapewnij sobie, ze będziesz miał utx (kontener Ci wstrzyknie, albo pobierzesz via jndi, zgadniesz etc.)

utx.begin();

entityManager.joinTransaction();

// zrób cośtam na entityManagerze

utx.commit();

0
jarekczek napisał(a):

Musisz skorzystać z automatu EE generującego transakcje, nie możesz ich ręcznie tworzyć. Przypuszczam, że pobierasz EM w niewłaściwy sposób. Nie możesz go wstrzyknąć bezpośrednio do klasy, w której wykonujesz ten kod update?

Czy masz na myśli :

@PersistenceContext(unitName = "PawSignup")
protected EntityManager entityManager;

Powyższe znajduje się w klasie abstrakcyjnej AbstractDao<T> do której mam dostęp dzięki wstrzyknięciu :
zależności :

@ManagedProperty(value="#{studentDatabaseBean}")
public StudentService studentService;

do mojej klasy wykonawczej (updatującej).

W klasie AbstractDao<T> są zdefiniowane metody " checkForSingleResult, create, merge, List<T> all(), get(Object id) służące do
współpracy z bazą danych, ale nie ma wśród nich metody update-u (jak dobrze to rozumiem), więc muszę takową stworzyć i czynię to klasie
o której mówimy , a EM "ciągnę" z AbstractDao<T> poprzez gettera

Zastanów się jakie masz różnice pomiędzy kodem który działa (insert), a kodem, który nie działa (update). To czy robisz insert czy update jest bez znaczenia, ale może sposób pobierania Entity Managera (zależności między klasami między którymi przekazujesz tego managera) robi tę różnicę.

może ta opisana powyżej, z tym że np. metoda weryfikująca duplikaty w bazie danych przed zapisem tam nowych korzysta z zapytania CritteriaQuery
zdefiniowanego w innej klasie - nie AbstractDao<T> - i to rozwiązanie działa

Gdybyś miał klasę typu repository, to tam byłby wstrzykiwany EM, tam byłby kod pracujący na bazie i nie powinno być żadnych problemów. Zgodnie z zasadą enkapsulacji.

Może klasę typu repository= AbstractDao<T> ?

0
yarel napisał(a):

A może tak?

UserTransaction utx = ... ;    // zapewnij sobie, ze będziesz miał utx (kontener Ci wstrzyknie, albo pobierzesz via jndi, zgadniesz etc.)

Niestety po wprowadzeniu powyższego np. UserTransaction ut = (UserTransaction) ctx.lookup("java:comp/UserTransaction");
Intelij IDEA świeci na czerwono i nie da się importować żadnej klasy.

Nie posiadam jeszcze doświadczenia , aby gdzieś w zasobach (serwer, plik persistance.xhtml ?) wprowadzić
adnotację,wpis etc.

Pomożesz/podpowiesz ?

utx.begin();

entityManager.joinTransaction();

// zrób cośtam na entityManagerze

utx.commit();

1
JavaRookie napisał(a):

...

Niestety po wprowadzeniu powyższego np. UserTransaction ut = (UserTransaction) ctx.lookup("java:comp/UserTransaction");
Intelij IDEA świeci na czerwono i nie da się importować żadnej klasy.

Nie posiadam jeszcze doświadczenia , aby gdzieś w zasobach (serwer, plik persistance.xhtml ?) wprowadzić
adnotację,wpis etc.

Pomożesz/podpowiesz ?

  1. javax.transaction.UserTransaction świeci na czerwono, tzn. że musisz dodać jara (na potrzeby kompilacji, bo serwer aplikacyjny dostarczy Ci implementację) w którym jest ten interfejs - pewnie będzie to jakiś Wildfly'owy jar z JTA w nazwie, albo jakaś mega paczka z nazwą -j2ee-.jar

Możesz też mieć ten interfejs dostępny z jakiegoś innego pakietu (np. OpenEJB)
https://www.findjar.com/class/javax/transaction/UserTransaction.html

  1. Spróbuj dodać @Resource nad UserTransaction i może zadziała ;-)

Ewentualnie spróbować wyszukać w JNDI po "java:jboss/UserTransaction" (Wildfly/Jboss), a nie po "java:comp/UserTransaction

Hibernate + EJB, ciekawy temat wybrałeś na początek ;-) Wydaje mi się, że lepiej byłoby, gdybyś każdy z tematów dobrze opanował, a później brał się za tworzenie takich hybryd. JTA to cięższy/grubszy temat, bo obejmuje transakcje rozproszone, wprowadza koncepcję zarządcy transakcji, zarządcy zasobów, zaś Ty, z lokalnymi (tj. na 1 źródle danych) masz problemy. Jak masz jedną bazę, to bierzesz taką armatę na wróbla. Odrzut działa może Cię zabić w pewnym momencie. Oczywiście to tylko taka opinia z przymrużeniem oka.

0
yarel napisał(a):
JavaRookie napisał(a):

...

  1. javax.transaction.UserTransaction świeci na czerwono, tzn. że musisz dodać jara (na potrzeby kompilacji, bo serwer aplikacyjny dostarczy Ci implementację) w którym jest ten interfejs - pewnie będzie to jakiś Wildfly'owy jar z JTA w nazwie, albo jakaś mega paczka z nazwą -j2ee-.jar

W jaki sposób mam to zrobić ?
Pobrać ze stron Wildfly.org , ale który plik, bowiem

12.0.0.Final 2018-02-28 Java EE7 Full & Web Distribution LGPL 162 MB

już jest zainstalowany a nie widzę tam odrębnego pliku z JTA nazwie

?

Możesz też mieć ten interfejs dostępny z jakiegoś innego pakietu (np. OpenEJB)
https://www.findjar.com/class/javax/transaction/UserTransaction.html

  1. Spróbuj dodać @Resource nad UserTransaction i może zadziała ;-)

niestety nie zdziałało

Ewentualnie spróbować wyszukać w JNDI po "java:jboss/UserTransaction" (Wildfly/Jboss), a nie po "java:comp/UserTransaction

tez nie działa

Cały czas świeci na czerwono i nie znajduje w sieci pliku jar. z klasą dla UserTransaction

Hibernate + EJB, ciekawy temat wybrałeś na początek ;-) Wydaje mi się, że lepiej byłoby, gdybyś każdy z tematów dobrze opanował, a później brał się za tworzenie takich hybryd. JTA to cięższy/grubszy temat, bo obejmuje transakcje rozproszone, wprowadza koncepcję zarządcy transakcji, zarządcy zasobów, zaś Ty, z lokalnymi (tj. na 1 źródle danych) masz problemy. Jak masz jedną bazę, to bierzesz taką armatę na wróbla. Odrzut działa może Cię zabić w pewnym momencie. Oczywiście to tylko taka opinia z przymrużeniem oka.

zapewne masz rację , ale jestem związany terminem i muszę kontynuować to co zacząłem, a ponieważ jestem 'rookie' niestety idzie mi to wolno jak widać.

Jest jakaś rada , nie spodziewałem się , że natknę na taka 'kobyłę'....

?

1

w tym kodzie który wkleiłeś robisz flush poza transakcją

em.getTransaction().begin();
query.executeUpdate();
em.getTransaction().commit();
em.flush();

https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#flush--

jeżeli nie musisz to pozwól frejmłorkom zarządzać transakcjami, wystarczy że dasz @stateless nad klasą i już nic więcej nie musisz robić

1

a, i używaj pary

@Named
@javax.faces.view.ViewScoped

zamiast

@ManagedBean
@javax.faces.bean.ViewScoped
0

Dzięki za wskazanie właściwego rozwiązania
.
Istotnie mieliście 100 % rację : błędnie wymyśliłem metodę modyfikacji na bazie za pomocą EM pobieranego z klasy współpracującej z bazą w pakiecie (...).jpa oraz procedury w innej klasie
.
Należało zdefiniować metodę w klasie abstrakcyjnej jpa , w której istnieje pole protected EM i poprzez interfejs uruchomić ją z innej klasy
.
Transakcje zatem w tym konkretnym przypadku nie są potrzebne, ale......

nurtuje mnie inne pytanie : dlaczego nie są potrzebne i jaka musiałaby być architektura aplikacji , aby były one konieczne

?

0

Transakcje są potrzebne i teraz już je masz. Tylko że to są transakcje implicit (niejawne). Poczytaj o transakcjach w EE, przy JTA, jak chcesz wiedzieć więcej.

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