Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    43

    [JPA] problema con campo AUTO_INCREMENT

    ciao
    ho fatto una piccola prova creando una tabella con un campo auto_increment (posto sotto il codice autogenerato dell'entità)... il problema è che se non gli setto io manualmente l'ID e vado a fare la persist dell'oggetto comprensivo di tutti i campi mi genera una ejb.exception....
    non riesco a capire proprio quale siaaa... per una stupidata del genereee devo impazziree!
    dove stà il problema secondo voi?

    codice:
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package entity2;
    
    import java.io.Serializable;
    import javax.persistence.Basic;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.NamedQueries;
    import javax.persistence.NamedQuery;
    import javax.persistence.Table;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    import javax.xml.bind.annotation.XmlRootElement;
    
    /**
     *
     * @author Flaka
     */
    @Entity
    @Table(name = "Login")
    @XmlRootElement
    @NamedQueries({
        @NamedQuery(name = "Login.findAll", query = "SELECT l FROM Login l"),
        @NamedQuery(name = "Login.findById", query = "SELECT l FROM Login l WHERE l.id = :id"),
        @NamedQuery(name = "Login.findByUsername", query = "SELECT l FROM Login l WHERE l.username = :username"),
        @NamedQuery(name = "Login.findByPassword", query = "SELECT l FROM Login l WHERE l.password = :password"),
        @NamedQuery(name = "Login.findByValidato", query = "SELECT l FROM Login l WHERE l.validato = :validato")})
    public class Login implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy= GenerationType.IDENTITY)
        @Basic(optional = false)
        @NotNull
        @Column(name = "Id")
        private Integer id;
        @Basic(optional = false)
        @NotNull
        @Size(min = 1, max = 45)
        @Column(name = "Username")
        private String username;
        @Basic(optional = false)
        @NotNull
        @Size(min = 1, max = 32)
        @Column(name = "Password")
        private String password;
        @Basic(optional = false)
        @Column(name = "Validato")
        private boolean validato=false;
    
        public Login() {
        }
    
        public Login(Integer id) {
            this.id = id;
        }
    
        public Login(Integer id, String username, String password, boolean validato) {
            this.id = id;
            this.username = username;
            this.password = password;
            this.validato = validato;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public boolean getValidato() {
            return validato;
        }
    
        public void setValidato(boolean validato) {
            this.validato = validato;
        }
    
        @Override
        public int hashCode() {
            int hash = 0;
            hash += (id != null ? id.hashCode() : 0);
            return hash;
        }
    
        @Override
        public boolean equals(Object object) {
            // TODO: Warning - this method won't work in the case the id fields are not set
            if (!(object instanceof Login)) {
                return false;
            }
            Login other = (Login) object;
            if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
                return false;
            }
            return true;
        }
    
        @Override
        public String toString() {
            return "entity2.Login[ id=" + id + " ]";
        }
        
    }
    grazie a tutti

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Credo che se non ci fai vedere:

    1) Come attui la persistenza
    2) L'eccezione completa

    sarà difficile darti ulteriori suggerimenti.

    Il codice che hai postato è corretto. Al massimo toglierei l'annotazione @NotNull dal campo già marcato come @Id (se un campo viene marcato come @Id viene considerato chiave primaria, e una chiave primaria, per definizione, non può essere nulla).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    43
    ciao... il codice non è altro che questo:

    MANAGED BEANS
    codice:
    @ManagedBean
    @RequestScoped
    public class RegistrationBean {
        @EJB
        private AuthBean authBean;
    
     public Login user=new Login();
       
    public void send(){
    authBean.registra(user);
    }
     public Login getUser() {
            return user;
       }
    JSF
    codice:
    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    To change this template, choose Tools | Templates
    and open the template in the editor.
    -->
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" 
          xmlns:h="http://java.sun.com/jsf/html" 
          xmlns:f="http://java.sun.com/jsf/core">
        <head>
            <title>TODO supply a title</title>
        </head>
        <body>
            <f:view>
                <div> <h:form>
                        <h1><h:outputText value="Create/Edit"/></h1>
                        <h:panelGrid columns="2">
                            <h:outputLabel value="Username:" for="username" />
                            <h:inputText id="username"  value="#{registrationBean.user.username}" title="Username" required="true" requiredMessage="The Username field is required."/>
                            <h:outputLabel value="Password:" for="password" />
                            <h:inputText id="password" value="#{registrationBean.user.password}" title="Password" required="true" requiredMessage="The Password field is required."/>
                        </h:panelGrid>
                        
                        <h:commandButton action="#{registrationBean.send()}" value="ok"  />
                    </h:form>
                        </div>      
            
            </f:view>
    
        </body>
    </html>
    EJB
    codice:
    @Stateless
    @LocalBean
    public class AuthBean {
        @PersistenceContext(unitName = "applicationJPA-ejbAUTH")
        private EntityManager em;
     
        
        public void registra(Login user) {
           em.persist(user);
        }

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Manca ancora il trace completo dell'eccezione che viene sollevata.

    Ad occhio, comunque, manca l'apertura e la commit della transazione, che l'operazione di persist richiede obbligatoriamente.

    Quindi, o inietti una UserTransaction (nel tuo caso, mi sa che ti serve questa) oppure ottieni la transazione dall'EntityManager. Questo esempio nel caso di Bean non managed:

    codice:
    EntityManager em ...
    ...
    public void registra(Login user) {
       em.getTransaction().begin();
       em.persist( user );
       em.getTransaction().commit();
    }
    Nel caso di managed beans avrai una UserTransaction su cui richiamare begin() e commit().


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    43
    ...................... ma che stupidata è questa!?!?! ho risolto semplicemente togliendo il @NotNull
    okkk è scontato il @NotNull su una PK, ma oltre ad avermelo auto generato il framework, non può causare il non funzionamento di applicazione è semplicemente una ridondanza.... mha....




    ps: nell'ejb 3.0(se non sbaglio in questa versione è stato introdotto questo meccaniscmo) le transazioni vengono gestite in maniera automatica dal management transaction se si vogliono gestire manualmente và dichiarato attraverso le annotation o nel dployment descriptor...


    Un saluto e grazie per la disponibilità!

    Alla prossima ciao!

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.