Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    142

    [JSF - Hibernate] Problema con UNIQUE KEY

    Ciao a tutti,
    sto mettendo su un'applicazione web che fa uso di jsf 1.2 e hibernate 3.3.2.

    Nel database ho definito delle chiavi univoche per evitare di avere dei campi ripetuti (oltre alle chiavi primarie)

    Se provo ad inserire un valore ripetuto (as esempio un username come nell'esempio) non mi viene sollevata alcuna eccezione, mi viene fornito solo questa indicazione nell'output del Tomcat:

    codice:
    9-mar-2010 11.49.11 org.hibernate.util.JDBCExceptionReporter logExceptions
    AVVERTENZA: SQL Error: 2627, SQLState: 23000
    9-mar-2010 11.49.11 org.hibernate.util.JDBCExceptionReporter logExceptions
    GRAVE: Violation of UNIQUE KEY constraint 'UN_USERNAME'. Cannot insert duplicate key in object 'dbo.UTENTE'.
    L'applicazione sembra bloccata e anche il db (se provo a richiedere la modifica dei record dal managment studio dell'sql i dati non mi vengono caricati e dopo un timeout mi viene dato un errore). Per sbloccare la situazione devo riavviare il tomcat.

    Qualcuno può darmi indicazioni a riguardo?

    di seguito il codice che esegue il commit:

    codice:
    EntityManager em = null;
            try {
                em = getEntityManager();
                em.getTransaction().begin();
              ......
              ......
                em.getTransaction().commit();
    
                }
            } catch (Exception ex) {
                  System.out.println ( "Eccezione");
            } finally {
                 System.out.println ( "Sono nel finally ");
                if (em != null) {
                    em.close();
                }
            }
    Nessuna eccezione viene sollevata!

  2. #2

    [Hibernate] Problema con UNIQUE KEY

    Perchè non ci mostri come hai mappato le entita con il database. Posta il file hbm.xml di configurazione oppure se hai utilizzato le annotations posta il bean incriminato.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    142
    Ho utilizzato la funzione integrata del netbeans ( Entity classes from Database per creare i beans e poi la funzione che crea in automatico le jsp dalle entità)

    codice:
    @Entity
    @Table(name = "UTENTE")
    @NamedQueries({@NamedQuery(name = "Utente.findAll", query = "SELECT u FROM Utente u"), @NamedQuery(name = "Utente.findByIdUTENTE", query = "SELECT u FROM Utente u WHERE u.idUTENTE = :idUTENTE"), @NamedQuery(name = "Utente.findByUsername", query = "SELECT u FROM Utente u WHERE u.username = :username"), @NamedQuery(name = "Utente.findByPassword2", query = "SELECT u FROM Utente u WHERE u.password2 = :password2"), @NamedQuery(name = "Utente.findByNome", query = "SELECT u FROM Utente u WHERE u.nome = :nome"), @NamedQuery(name = "Utente.findByCognome", query = "SELECT u FROM Utente u WHERE u.cognome = :cognome"), @NamedQuery(name = "Utente.findByEmail", query = "SELECT u FROM Utente u WHERE u.email = :email"), @NamedQuery(name = "Utente.findByInterno", query = "SELECT u FROM Utente u WHERE u.interno = :interno"), @NamedQuery(name = "Utente.findByRuolo", query = "SELECT u FROM Utente u WHERE u.ruolo = :ruolo"), @NamedQuery(name = "Utente.findByLivello", query = "SELECT u FROM Utente u WHERE u.livello = :livello"), @NamedQuery(name = "Utente.findByCodreg", query = "SELECT u FROM Utente u WHERE u.codreg = :codreg"), @NamedQuery(name = "Utente.findByAbilitato", query = "SELECT u FROM Utente u WHERE u.abilitato = :abilitato")})
    public class Utente implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        @Column(name = "idUTENTE")
        private Integer idUTENTE;
        @Column(name = "USERNAME")
        private String username;
        @Column(name = "PASSWORD_2")
        private String password2;
        @Column(name = "NOME")
        private String nome;
        @Column(name = "COGNOME")
        private String cognome;
        @Column(name = "EMAIL" )
        private String email;
        @Column(name = "INTERNO")
        private Boolean interno;
        @Column(name = "RUOLO")
        private String ruolo;
        @Column(name = "LIVELLO")
        private Integer livello;
        @Column(name = "CODREG")
        private String codreg;
        @Column(name = "ABILITATO")
        private Boolean abilitato;
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "idUTENTE", fetch = FetchType.EAGER)
        private Set<Schedam> schedamSet;
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "idUTENTE", fetch = FetchType.EAGER)
        private Set<Derivati> derivatiSet;
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "idUTENTE", fetch = FetchType.EAGER)
        private Set<Nuovafase> nuovafaseSet;
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "idUTENTE", fetch = FetchType.EAGER)
        private Set<Inviotecnico> inviotecnicoSet;
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "idUTENTE", fetch = FetchType.EAGER)
        private Set<Richiesta> richiestaSet;
        @JoinColumn(name = "idDITTA", referencedColumnName = "idDITTA")
        @ManyToOne(optional = false, fetch = FetchType.EAGER)
        private Ditta idDITTA;
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "idUTENTE", fetch = FetchType.EAGER)
        private Set<Collaudo> collaudoSet;
    
        public Utente() {
        }
    
        public Utente(Integer idUTENTE) {
            this.idUTENTE = idUTENTE;
        }
    
        public Integer getIdUTENTE() {
            return idUTENTE;
        }
    
        public void setIdUTENTE(Integer idUTENTE) {
            this.idUTENTE = idUTENTE;
        }
    .....
    ....
    Cmq è molto strano... ho messo degli output prima del committ dell'inserimento ma non mi viene mostrato nulla...

    Non capisco dove faccia quel controllo. :master:

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    633
    Per eseguire una corretta gestione dell’eccezione occorre approfondire il ciclo di vita della transazione a DB all’interno della sessione Hibernate, Infatti, sebbene le “azioni Hibernate” (persist, remove, ecc.) prevedano aggiornamenti ai dati nel DB, in realtà Hibernate esegue le istruzioni SQL solo in seguito ad una delle seguenti azioni:

    1) Quando la transazione a DB è eseguita (commit).
    2) Quando l’EntityManager Hibernate esegue lo scarico (flush) delle azioni.

    Se le transazioni sono di tipo CMT (Container-Managed Transactions, ovvero è l’EJB Container a definire i confini della transazione) il caso 1, precedentemente descritto, avviene all’uscita dall’EJBContainer e non è gestito applicativamente. Questo significa che, senza “forzare” la flush dell’EntityManager, non è possibile gestire all’interno dei metodi di EJB le eccezioni sollevate dal DB.
    Alcuni miei articoli in PRO.HTML.IT: JavaScript | DHTML | DOM
    Sviluppo : wedev | forum

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    142
    Quindi se non è possibile gestire l'eccezione nell'applicativo conviene che controlli prima di mandare il commit se effettivamente viene rispettato il vincolo sui campi che devono essere unici.

    Ma come mai gli output non mi vengono forniti?

    grazie.

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    142
    L'errore viene generato già da questa istruzione:

    codice:
    em.getTransaction().begin();
    Ho risolto controllando prima di questa istruzione, se i dati sono già presenti sollevo l'eccezione da codice.

    Può andare bene? Sembra funzionare... ma aspetto il vostro parere

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    633
    scusa il ritardo nella risposta...
    cmq sì, è corretto: in una gestione CMT conviene controllare prima cose come la coerenza dei dati (rotture di chiavi univoche, foreign key, altri vincoli...)
    ciauz
    Alcuni miei articoli in PRO.HTML.IT: JavaScript | DHTML | DOM
    Sviluppo : wedev | forum

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.