Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Upravljanje sa transakcijama u Seamu

[es] :: Java :: Upravljanje sa transakcijama u Seamu

[ Pregleda: 1304 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

IgorMedo
Igor Madjeric
Doboj

Član broj: 101335
Poruke: 30
79.143.169.*



Profil

icon Upravljanje sa transakcijama u Seamu12.01.2009. u 10:29 - pre 186 meseci
Imam jedan problem vezan za rad sa transakcijama.
Koristim JPA i Hibernate kao provajdera.
I ako sam postavio da je FlushModeType.MANUAL, upis u bazu se vrsi automatski a ne kada pozovem entityManager.flush.

Imam jednu JSF stranu na kojoj unosim podatke. Kada pritisnem taster pokrenem metodu addRole(), i odmah se podaci upisu u bazu. Conversation iz kojeg pozivam ovu klasu je takodje ima podesen FlushModeType.MANUAL

Evo kod klase:

Code:

package de.codecentric.hr.controller;

import javax.persistence.EntityManager;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.FlushModeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

import de.codecentric.hr.model.Roles;

@Name("rolesController")
@Scope(ScopeType.CONVERSATION)
public class RolesController {

    @In
    private EntityManager entityManager;

    @Create
    public void create(){

    }
    
    @Begin(join=true,flushMode=FlushModeType.MANUAL)
    public boolean addRoles (Roles roles){
        try{
            entityManager.persist(roles);
            return true;
        } catch (Exception ex) {
        return false;
        }
    }
        
    public Roles findRoles(int pk) {
        try {
            return entityManager.find(Roles.class, pk);
        } catch (Exception ex) {
            return null;
        }
    }
    
    public boolean removeRoles(int pk) {
        try {
            Roles roles = entityManager.find(Roles.class, pk);
            entityManager.remove(roles);
            return true;
        } catch (Exception ex) {
            return false;
        }
    }
    
    public void comit(){
        entityManager.flush();
    }
}



Evo moje component.xml datoteke:

Code:

<?xml version="1.0" encoding="UTF-8"?>
<components xmlns="http://jboss.com/products/seam/components"
            xmlns:core="http://jboss.com/products/seam/core" 
            xmlns:persistence="http://jboss.com/products/seam/persistence"
            xmlns:security="http://jboss.com/products/seam/security"
            xmlns:transaction="http://jboss.com/products/seam/transaction"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:rich="http://richfaces.ajax4jsf.org/rich"
            xmlns:ui="http://java.sun.com/jsf/facelets"
            xsi:schemaLocation=
                "http://jboss.com/products/seam/core 
                 http://jboss.com/products/seam/core-2.1.xsd
                 http://jboss.com/products/seam/transaction 
                 http://jboss.com/products/seam/transaction-2.1.xsd
                 http://jboss.com/products/seam/components 
                 http://jboss.com/products/seam/components-2.1.xsd
                 http://jboss.com/products/seam/persistence
                 http://jboss.com/products/seam/persistence-2.1.xsd 
                 http://jboss.com/products/seam/security 
                 http://jboss.com/products/seam/security-2.1.xsd">

    
    
    <core:init jndi-pattern="cc-hr/#{ejbName}/local" debug="true"/>

    <core:manager conversation-timeout="120000"
                  default-flush-mode="MANUAL"
                  concurrent-request-timeout="500"
                  conversation-id-parameter="cid"/>
            
    <persistence:entity-manager-factory name="entityManagerFactory" persistence-unit-name="hrDatabase" /> 
      <persistence:managed-persistence-context name="entityManager" auto-create="true" entity-manager-factory="#{entityManagerFactory}" /> 
      <transaction:ejb-transaction />
        
    <component name="authenticator" class="de.codecentric.hr.controller.StandardAuthenticatorService" auto-create="true" scope="EVENT" /> 
          
    <security:identity authenticate-method="#{authenticator.authenticate}" remember-me="true"/>
        <event type="org.jboss.seam.security.notLoggedIn">
              <action execute="#{redirect.captureCurrentView}"/>
              <action execute="#{identity.tryLogin()}"/>
        </event>
        <event type="org.jboss.seam.security.loginSuccessful">
            <action execute="#{redirect.returnToCapturedView}"/>
        </event>
</components>
[code][code]
 
Odgovor na temu

IgorMedo
Igor Madjeric
Doboj

Član broj: 101335
Poruke: 30
79.143.169.*



Profil

icon Re: Upravljanje sa transakcijama u Seamu13.01.2009. u 14:25 - pre 186 meseci
Ovako rje[io sam problem.

Pa ako neko bude imao slicnih problema evo rjesenja i obrazlozenja.

Seam upravlja sesijam tako sto svaka Metoda prestavlja jednu transakciju, sto je i dobra stvar, medjutim nekada imamo potrebu da upis podataka ne vrsimo u jednoj metodi nego ih skupljamo kroz vise metoda i u jednoj metodi potvrdjujemo izmjene (Primjera radi ukoliko pravimo carabnjake). Da bi mogli rjesiti taj problem moramo raci Seamu da on vise ne upravlja transakcijama. To radimo tako sto u component.xml dodamo:
Code:

<core:init transaction-management-enabled="false"/>

<persistence:entity-manager-factory name="entityManagerFactory" persistence-unit-name="hrDatabase" /> 
<persistence:managed-persistence-context name="entityManager" auto-create="true" entity-manager-factory="#{entityManagerFactory}" /> 
<transaction:ejb-transaction></transaction:ejb-transaction>


I sada mozemo da koristimo Hibernate FlushModeType. I dole navedeni Bean ce uraditi sve sto treba.

Treb naglasiti da se ovo moze koristit samo kada koristimo JPA cij je provajder Hibernate (barem trenutno ostali provajderi ne podrzavaju jos ovakav pristup transakcijama) ili samo Hibernate.

Pozdrav



 
Odgovor na temu

[es] :: Java :: Upravljanje sa transakcijama u Seamu

[ Pregleda: 1304 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.