Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [j2ee-ejb3] problema con la persistenza nel db di una FOREIGN KEY

    Mi scuso se in questi giorni vi sto disturbando unpo troppo.Ma è la prima volta che programmo in j2ee e devo fare un progetto per un esame, è non so a chiedere oggi se non a voi.

    volevo chiedervi un informazione molto importate sulle persistenze io ho un db con 12 tabelle, di cui: 2 tabelle relazionare e 3 che hanno come key una chiave esterna.
    io ora sto lavorando su una di queste che ha una chiave esterna, le strutture delle 2 tabelle sono fatte cosi:
    -ordinabile: (cod)
    -piatto: (ordinabilecod,nome, descrizione, prezzo, image)

    ordinabilecod è una FOREIGN KEY di ordinabile.cod.
    LE 2 tabelle sembrano apparentemente semplici....ho fatto dei fari tantativi in java ma mi da vari errori, Ho provato a fare un inserimento da phpmyadmin nel db mysql è non da nessun errore, fa l'inserimento senza problemi.

    il codice java che ho scritto per l'inserimento e questo, con i seguenti passi.
    creo la form aggiungiPiatto.html con action alla servlet addPiattoServlet (nome servlet è: AddPiattiServlet.java) scrivo solo nel metodo doPost. queste linee di codice:
    codice:
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            processRequest(request, response);
            System.out.println("sn dentro la servlet add piatto");
            String nome= request.getParameter("nome");
            String descr= request.getParameter("desc");
            String prezzo= request.getParameter("prezzo");
            String img= request.getParameter("img");
            prezzo=prezzo.replaceAll(",","."); //senza spazi
            double pre= Double.parseDouble(prezzo);
            System.out.println("sn dentro la servlet add piatto creo il paitto");
            Piatto p= new Piatto(null);
            p.setDescrizione(descr);
            p.setImage(img);
            p.setNome(nome);
            p.setPrezzo(pre);
            //int cod=gestore.addOrdinabile();
            
            gestore.addPiatto(p);
            System.out.println("sn dentro la servlet add piatto piatto aggiunto");
        }
    gli altri metodi li rascio invariati.
    la chiamata:
    gestore.addPiatto chiama il bean gestoreRistorante... il metodo add paitto che il codice è questo:
    codice:
        public void addPiatto(Piatto p) {
             System.out.println("sn dentro la bean add piatto");
            if(p.getOrdinabilecod()!=null){
                System.out.println("sn dentro la bean add piatto");
                Piatto a = em.find(Piatto.class, p.getOrdinabilecod());
                if (a != null){
                    throw new RuntimeException("Piatto GIA' PRESENTE!");
                }
            }
                System.out.println("sn dentro la bean add piatto nessuna eccezione alnciata");
             
                em.persist(p);
            
                
        }
    l'errore che lancia e questo:
    guardate stampa pure tutti i println fino a em.persist poi qui lancia l'eccezione.
    codice:
    INFO: sn dentro la bean add piatto nessuna eccezione alnciata
    AVVERTENZA: A system exception occurred during an invocation on EJB GestioneRistorante method public void server.GestioneRistorante.addPiatto(model.Piatto)
    javax.ejb.EJBException
    	at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5194)
    	at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5092)
    	at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4880)
    	at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2039)
    	at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1990)
    	at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:222)
    	at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88)
    	at $Proxy229.addPiatto(Unknown Source)
    	at servlet.AggiungiPiatto.doPost(AggiungiPiatto.java:95)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:755)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
    	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
    	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
    	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
    	at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
    	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:227)
    	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:170)
    	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822)
    	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719)
    	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013)
    	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
    	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
    	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
    	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
    	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
    	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
    	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
    	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
    	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
    	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
    	at java.lang.Thread.run(Thread.java:662)
    Caused by: javax.validation.ConstraintViolationException: Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'prePersist'. Please refer to embedded ConstraintViolations for details.
    	at org.eclipse.persistence.internal.jpa.metadata.listeners.BeanValidationListener.validateOnCallbackEvent(BeanValidationListener.java:90)
    	at org.eclipse.persistence.internal.jpa.metadata.listeners.BeanValidationListener.prePersist(BeanValidationListener.java:62)
    	at org.eclipse.persistence.descriptors.DescriptorEventManager.notifyListener(DescriptorEventManager.java:698)
    	at org.eclipse.persistence.descriptors.DescriptorEventManager.notifyEJB30Listeners(DescriptorEventManager.java:641)
    	at org.eclipse.persistence.descriptors.DescriptorEventManager.executeEvent(DescriptorEventManager.java:200)
    	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObjectClone(UnitOfWorkImpl.java:4216)
    	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNotRegisteredNewObjectForPersist(UnitOfWorkImpl.java:4193)
    	at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.registerNotRegisteredNewObjectForPersist(RepeatableWriteUnitOfWork.java:493)
    	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:4135)
    	at org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist(EntityManagerImpl.java:406)
    	at com.sun.enterprise.container.common.impl.EntityManagerWrapper.persist(EntityManagerWrapper.java:269)
    	at server.GestioneRistorante.addPiatto(GestioneRistorante.java:56)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:597)
    	at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
    	at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
    	at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5367)
    	at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619)
    	at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:801)
    	at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)
    	at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162)
    	at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144)
    	at sun.reflect.GeneratedMethodAccessor123.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:597)
    	at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:862)
    	at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:801)
    	at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:371)
    	at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5339)
    	at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5327)
    	at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:214)
    	... 30 more
    chiedendo in giro hai miei colleghi mi hanno riferito che l'aggiornamento della tabella ordinabile lo deve fare l'entity in automatico.

  2. #2
    Magari posta anche l'entity in questione, mi sa che l'errore sta proprio sul mapping effettuato.

  3. #3
    ormai mi aspetto di tutto a dire il vero l'entity la davo per buona ..
    poiche lo generata automaticamente da netbeans prendendo il db da mysql con la conessione le ho data per buone ......
    cmq il codice dei entity e questo:
    piatto:
    codice:
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package model;
    
    import java.io.Serializable;
    import java.util.Collection;
    import javax.persistence.Basic;
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.ManyToMany;
    import javax.persistence.NamedQueries;
    import javax.persistence.NamedQuery;
    import javax.persistence.OneToMany;
    import javax.persistence.OneToOne;
    import javax.persistence.Table;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlTransient;
    
    /**
     *
     * @author orphen
     */
    @Entity
    @Table(name = "piatto", catalog = "GestioneRistorante", schema = "")
    @XmlRootElement
    @NamedQueries({
        @NamedQuery(name = "Piatto.findAll", query = "SELECT p FROM Piatto p"),
        @NamedQuery(name = "Piatto.findByOrdinabilecod", query = "SELECT p FROM Piatto p WHERE p.ordinabilecod = :ordinabilecod"),
        @NamedQuery(name = "Piatto.findByDescrizione", query = "SELECT p FROM Piatto p WHERE p.descrizione = :descrizione"),
        @NamedQuery(name = "Piatto.findByNome", query = "SELECT p FROM Piatto p WHERE p.nome = :nome"),
        @NamedQuery(name = "Piatto.findByPrezzo", query = "SELECT p FROM Piatto p WHERE p.prezzo = :prezzo"),
        @NamedQuery(name = "Piatto.findByImage", query = "SELECT p FROM Piatto p WHERE p.image = :image")})
    public class Piatto implements Serializable {
        @Size(max = 255)
        @Column(name = "image", length = 255)
        private String image;
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "piatto")
        private Collection<MenuPiatti> menuPiattiCollection;
        private static final long serialVersionUID = 1L;
        @Id
        @Basic(optional = false)
        @NotNull
        @Column(name = "ordinabilecod", nullable = false)
        private Integer ordinabilecod;
        @Size(max = 255)
        @Column(name = "descrizione", length = 255)
        private String descrizione;
        @Basic(optional = false)
        @NotNull
        @Size(min = 1, max = 255)
        @Column(name = "nome", nullable = false, length = 255)
        private String nome;
        @Basic(optional = false)
        @NotNull
        @Column(name = "prezzo", nullable = false)
        private double prezzo;
        @ManyToMany(mappedBy = "piattoCollection")
        private Collection<Menu> menuCollection;
        @JoinColumn(name = "ordinabilecod", referencedColumnName = "cod", nullable = false, insertable = false, updatable = false)
        @OneToOne(optional = false)
        private Ordinabile ordinabile;
    
        public Piatto() {
        }
    
        public Piatto(Integer ordinabilecod) {
            this.ordinabilecod = ordinabilecod;
        }
    
        public Piatto(Integer ordinabilecod, String nome, double prezzo) {
            this.ordinabilecod = ordinabilecod;
            this.nome = nome;
            this.prezzo = prezzo;
        }
    
        public Integer getOrdinabilecod() {
            return ordinabilecod;
        }
    
        public void setOrdinabilecod(Integer ordinabilecod) {
            this.ordinabilecod = ordinabilecod;
        }
    
        public String getDescrizione() {
            return descrizione;
        }
    
        public void setDescrizione(String descrizione) {
            this.descrizione = descrizione;
        }
    
        public String getNome() {
            return nome;
        }
    
        public void setNome(String nome) {
            this.nome = nome;
        }
    
        public double getPrezzo() {
            return prezzo;
        }
    
        public void setPrezzo(double prezzo) {
            this.prezzo = prezzo;
        }
    
        @XmlTransient
        public Collection<Menu> getMenuCollection() {
            return menuCollection;
        }
    
        public void setMenuCollection(Collection<Menu> menuCollection) {
            this.menuCollection = menuCollection;
        }
    
        public Ordinabile getOrdinabile() {
            return ordinabile;
        }
    
        public void setOrdinabile(Ordinabile ordinabile) {
            this.ordinabile = ordinabile;
        }
    
        @Override
        public int hashCode() {
            int hash = 0;
            hash += (ordinabilecod != null ? ordinabilecod.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 Piatto)) {
                return false;
            }
            Piatto other = (Piatto) object;
            if ((this.ordinabilecod == null && other.ordinabilecod != null) || (this.ordinabilecod != null && !this.ordinabilecod.equals(other.ordinabilecod))) {
                return false;
            }
            return true;
        }
    
        @Override
        public String toString() {
            return "model.Piatto[ ordinabilecod=" + ordinabilecod + " ]";
        }
    
        @XmlTransient
        public Collection<MenuPiatti> getMenuPiattiCollection() {
            return menuPiattiCollection;
        }
    
        public void setMenuPiattiCollection(Collection<MenuPiatti> menuPiattiCollection) {
            this.menuPiattiCollection = menuPiattiCollection;
        }
    
        public String getImage() {
            return image;
        }
    
        public void setImage(String image) {
            this.image = image;
        }
        
    }
    mentre dio ordinabile è:
    codice:
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package model;
    
    import java.io.Serializable;
    import java.util.Collection;
    import javax.persistence.Basic;
    import javax.persistence.CascadeType;
    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.OneToMany;
    import javax.persistence.OneToOne;
    import javax.persistence.Table;
    import javax.validation.constraints.NotNull;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlTransient;
    
    /**
     *
     * @author orphen
     */
    @Entity
    @Table(name = "ordinabile", catalog = "GestioneRistorante", schema = "")
    @XmlRootElement
    @NamedQueries({
        @NamedQuery(name = "Ordinabile.findAll", query = "SELECT o FROM Ordinabile o"),
        @NamedQuery(name = "Ordinabile.LastId", query = "SELECT o FROM Ordinabile o ORDER BY o.cod DESC "),
        @NamedQuery(name = "Ordinabile.findByCod", query = "SELECT o FROM Ordinabile o WHERE o.cod = :cod")})
    public class Ordinabile implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Basic(optional = false)
        @NotNull
        @Column(name = "cod", nullable = false)
        private Integer cod;
        @OneToOne(cascade = CascadeType.ALL, mappedBy = "ordinabile")
        private Menu menu;
        @OneToOne(cascade = CascadeType.ALL, mappedBy = "ordinabile")
        private Piatto piatto;
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "ordinabilecod")
        private Collection<Ordine> ordineCollection;
    
        public Ordinabile() {
        }
    
        public Ordinabile(Integer cod) {
            this.cod = cod;
        }
    
        public Integer getCod() {
            return cod;
        }
    
        public void setCod(Integer cod) {
            this.cod = cod;
        }
    
        public Menu getMenu() {
            return menu;
        }
    
        public void setMenu(Menu menu) {
            this.menu = menu;
        }
    
        public Piatto getPiatto() {
            return piatto;
        }
    
        public void setPiatto(Piatto piatto) {
            this.piatto = piatto;
        }
    
        @XmlTransient
        public Collection<Ordine> getOrdineCollection() {
            return ordineCollection;
        }
    
        public void setOrdineCollection(Collection<Ordine> ordineCollection) {
            this.ordineCollection = ordineCollection;
        }
    
        @Override
        public int hashCode() {
            int hash = 0;
            hash += (cod != null ? cod.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 Ordinabile)) {
                return false;
            }
            Ordinabile other = (Ordinabile) object;
            if ((this.cod == null && other.cod != null) || (this.cod != null && !this.cod.equals(other.cod))) {
                return false;
            }
            return true;
        }
    
        @Override
        public String toString() {
            return "model.Ordinabile[ cod=" + cod + " ]";
        }
        
    }

    inserisco qua anche il codice sql delle 2 raltive tabelle:
    ps le ho esportate con phpmyadmin.
    ordinabile:
    codice:
    CREATE TABLE IF NOT EXISTS `ordinabile` (
      `cod` int(10) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`cod`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
    piatto
    codice:
    CREATE TABLE IF NOT EXISTS `piatto` (
      `ordinabilecod` int(10) NOT NULL,
      `descrizione` text,
      `nome` varchar(255) NOT NULL,
      `prezzo` double NOT NULL,
      `image` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`ordinabilecod`),
      KEY `FKpiatto864689` (`ordinabilecod`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    ALTER TABLE `piatto`
      ADD CONSTRAINT `FKpiatto864689` FOREIGN KEY (`ordinabilecod`) REFERENCES `ordinabile` (`cod`);

    ora guardado il db mi viene un dubbio. Forse la foreign key va al contrario cioe su ordinabile

  4. #4
    nessuno ha una mezza idea anche qualche intuito da fare a tentativi....

    comunque ho ho fatto in questo modo o inserito nella tabella rdinbile il valore a mano. cosi a creato un nuovo indice di valore 3 ho preso questo valore e lo settato in piatto con il metodo

    piatto.setOrdinabilecod(new Interger(3));

    ho lasciato il resto del codice invaribile e cancellato le chiamate a ordinabile.
    l'insaretimento a avuto successo.. a inserito la nuova tipla senza nessun problema.

    In conclusione l'errore sta nella persistenza di ordinabile.

    ho fatto questi tentativi ma sono andati tutti a vuoto lanciano senpre eccezioni.
    i tantativi somo:

    1.
    codice:
     Ordinabile o= new Ordinabile();
    em.persist(o);// da errore su questo codice
    2.
    codice:
     Ordinabile o= new Ordinabile();
    o.setCod(new Interger(null));
    em.persist(o);// da errore su questo codice
    3.
    codice:
     Ordinabile o= new Ordinabile();
    //p e il piatto che li passo via parametro al metdo p lo creo nella servlet
    o.setPiatto(p);
    em.persist(o);// da errore su questo codice

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.