Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    10

    EJB3 gestione di una INSERT

    Salve a tutti,
    sono al primo progetto con EJB3.0 e mi trovo ad avere un problema con la gestione di una insert in un db.

    Ho una tabella UTENTE così composta:
    -user: varchar (chiave)
    -password:varchar


    Questo è il codice della mia entity:

    codice:
    import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="KGTWANAUSER01") public class User implements Serializable { private static final long serialVersionUID = 1L; @Id @Column(name="USER") private String USER; @Column(name="PASSWORD") private String PASSWORD; //Costruttore standard public User(String us, String pswd) { this.user=us; this.password=pswd; } public String getUSER() { return USER; } public String getPASSWORD() { return PASSWORD; } public void setUSER(String uSER) { USER = uSER; } public void setPASSWORD(String pASSWORD) { PASSWORD = pASSWORD; } }
    E questa la mia session Bean:


    codice:
    import javax.ejb.Local; import javax.ejb.Stateless; import javax.ejb.Remote; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import model.User; @Stateless @Remote(HelloWorldBeanRemote.class) @Local(HelloWorldBeanLocal.class) public class HelloWorldBean implements HelloWorldBeanRemote, HelloWorldBeanLocal { @PersistenceContext (unitName="KGTMANAGER") EntityManager em; public HelloWorldBean() { // TODO Auto-generated constructor stub } public String getMessage(){ User prova= new User(); return prova.getCOGNOME(); } public User insert(String user, String password){ User us= new User(user,password); em.persist(us); return us; } }

    Il problema è che quando vado a fare un inserimento su uno user già esistente il sistema va in blocco perchè ovviamente il DB restituisce l'errore di chiave duplicata. La mia domanda è, quale è la procedura corretta da svolgere in questo caso?

    Fare una select prima facendo un Lock della tabella e poi fare la persist, oppure catturare in qualche modo l'errore della persist prima che il Jboss vada in errore, o altro?

    Grazie a chiunque possa darmi una mano

    Alessandro

  2. #2
    Perchè ovviamente chiamando il persist sull'entity manager lui cerca di inserirlo. Prova a chiamare il merge e lascia che si occupi jpa di gestire se è una nuova riga oppure una riga da aggiornare

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    10
    Eh no il problema è che non deve aggiornarla se già esiste. Il sistema dovrebbe catturare il fatto che l'elemento già esiste e avvisare l'utente dicendogli di cambiare lo username perchè quello è già stato usato da qualcunaltro.

    Come posso gestire questa cosa?

  4. #4
    Fai un query su l'id dell'entity e vedi se esiste.....

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    10
    Esatto è quello che ho pensato anche io, però poi mi sorge un dubbio sulla concorrenza.

    Se io faccio la select vedo che non c'è, e nel frattempo un altro fa una scrittura, mi fotte lo stesso, quindi c'è un modo per fare un lock dell'entità o cose del genere?

  6. #6
    Che implementazione stai usando di ejb3/jpa ?

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    10
    Io sto costruendo un progettino con eclipse, usando l'implementazione Ejb3, con jboss sotto.
    Ho fatto 3 progetti in eclipse, uno Java per il modello delle Entità, uno EJB per i session bean, e uno Web per le mie servlet/jsp.

    Non so se mi conviene usare qualche framework o procedere così a mano, accetto qualsiasi consiglio pur di uscire da questa situazione :P

    Grazie ancora

  8. #8
    La mia domanda era alquanto specifica. Ejb3/Jpa è uno standard a cui diverse aziende hanno dato un implementazione a questo standard (eclipselink,hibernate etc...).
    Cmq se hai usato eclipse l'implementazione usata dovrebbe essere eclipselink che consente due principali tipi di lock(Pessimistico,Ottimistico).
    link.
    Ciao

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2010
    Messaggi
    10
    Ho provato a are alcune prove, ma ho visto che facendo il versioning della risorsa ed eseguendo poi l'istruzione em.lock(us, LockModeType.WRITE); viene fatto il lock sulla riga specifica, io invece dovrei proprio bloccare la tabella.

    Infatti:

    1.A registra il suo nuovo account "pippo"
    2.A blocca tabella user
    3.A legge la tabella per vedere se esiste uno user identico a quello da lui inserito e non lo trova.
    3.B registra il suo nuovo account "pippo"
    4.B prova a bloccare la tabella user per leggerla ma non può
    5.A scrive il suo nuovo account e fa unlock della tabella
    6.B a questo punto può fare il lock
    7. legge la tabella, nella quale c'è già pippo, e avvisa l'utente che deve cambiare user.

    Come la gestisco questa cosa con EJB?

    Grazie ancora

  10. #10
    Secondo me è sbagliato l'approccio che stai usando in quando facendo cosi anche quando nel resto del programma vai solamente a leggere tale tabella se è lockata anche questo processo dovrà attendere che venga rimosso il lock e questo può causare un'alzamento del tempo di risposta di tutta l'applicazione.
    Un'altro modo con cui fare la stessa cosa è il seguente :
    Crei una tabella (chimiamola Lock) in cui ci vai a mettere una riga per esempio un intero. Dopo di che :
    1.A registra il suo nuovo account "pippo"
    2.A blocca la riga della tabella lock
    3.A legge la tabella per vedere se esiste uno user identico a quello da lui inserito e non lo trova.
    3.B registra il suo nuovo account "pippo"
    4.B prova a bloccare la riga della tabella lock per leggerla ma non può
    5.A scrive il suo nuovo account e fa unlock della tabella lock
    6.B a questo punto può fare il lock
    7. legge la tabella, nella quale c'è già pippo, e avvisa l'utente che deve cambiare user.

    In questo modo anche se nel resto del programma vai a leggere la tabella user essa non è mai lockata e quindi non crea problemi.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.