2010-06-12 3 views
2

Voici mon EJBéchec EJB mise à jour datamodel

@Entity 
@Table(name = "modelos") 
@NamedQueries({ 
    @NamedQuery(name = "Modelos.findAll", query = "SELECT m FROM Modelos m"), 
    @NamedQuery(name = "Modelos.findById", query = "SELECT m FROM Modelos m WHERE m.id = :id"), 
    @NamedQuery(name = "Modelos.findByDescripcion", query = "SELECT m FROM Modelos m WHERE m.descripcion = :descripcion")}) 
public class Modelos implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "id") 
    private Integer id; 
    @Basic(optional = false) 
    @Column(name = "descripcion") 
    private String descripcion; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idModelo") 
    private Collection<Produtos> produtosCollection; 
    @JoinColumn(name = "id_marca", referencedColumnName = "id") 
    @ManyToOne(optional = false) 
    private Marcas idMarca; 

    public Modelos() { 
    } 

    public Modelos(Integer id) { 
     this.id = id; 
    } 

    public Modelos(Integer id, String descripcion) { 
     this.id = id; 
     this.descripcion = descripcion; 
    } 

    public Modelos(Integer id, Marcas idMarca) { 
     this.id = id; 
     this.idMarca = idMarca; 
    } 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getDescripcion() { 
     return descripcion; 
    } 

    public void setDescripcion(String descripcion) { 
     this.descripcion = descripcion; 
    } 

    public Collection<Produtos> getProdutosCollection() { 
     return produtosCollection; 
    } 

    public void setProdutosCollection(Collection<Produtos> produtosCollection) { 
     this.produtosCollection = produtosCollection; 
    } 

    public Marcas getIdMarca() { 
     return idMarca; 
    } 

    public void setIdMarca(Marcas idMarca) { 
     this.idMarca = idMarca; 
    } 

    @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 Modelos)) { 
      return false; 
     } 
     Modelos other = (Modelos) 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 "" + descripcion + ""; 
    } 

} 

Et la méthode accesing de la Modelosfacade

public List<Modelos> findByMarcas(Marcas idMarca){ 
    return em.createQuery("SELECT id, descripcion FROM Modelos WHERE idMarca = "+idMarca.getId()+"").getResultList(); 
} 

Et la méthode d'appel du contrôleur

public String createByMarcas() { 
    //recreateModel(); 
    items = new ListDataModel(ejbFacade.findByMarcas(current.getIdMarca())); 
    updateCurrentItem(); 
    System.out.println(current.getIdMarca()); 
    return "List"; 
} 

Je ne comprends pas pourquoi je continue à tomber dans une exception EJB.

Caused by: javax.ejb.EJBException 
at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5070) 
at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:4968) 
at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4756) 
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1955) 
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1906) 
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:198) 
at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:84) 
at $Proxy347.findByMarcas(Unknown Source) 
at controladores.__EJB31_Generated__ModelosFacade__Intf____Bean__.findByMarcas(Unknown Source) 

Répondre

1

En fait, je suis presque sûr qu'il y a plus de traces utiles dans les journaux du serveur. Mais de toute façon, j'ai quelques remarques:

Tout d'abord, le id d'un Marca n'est pas un attribut de Modelos de sorte que votre requête n'est pas correct, vous devez soit passer une instance ou Marcas ou pour naviguer dans l'association si vous passez le id (vous devez penser à un objet et à des associations lorsque vous utilisez JPA). Deuxièmement, la manière dont vous exécutez votre requête n'est pas correcte, vous devez la paramétrer.

En troisième lieu, lors de l'utilisation des projections SQL, vous obtenez un Object[] (ou un List<Object[]> s'il y a plusieurs résultats), pas un bon résultat dactylographiée sauf si vous utilisez l'expression constructeur SELECT NEW.

Pour résumer, ce qui suit devrait fonctionner:

public List<Object[]> findByMarcas(Marcas marcas){ 
    Query q = em.createQuery("SELECT m.id, m.descripcion FROM Modelos m WHERE m.idMarca = :marcas"); 
    q.setParameter("marcas", marcas); 
    return q.getResultList(); 
} 

Ou, si vous passez l'identifiant comme paramètre de la requête (mais la requête ci-dessus est très bien):

public List<Object[]> findByMarcas(Marcas marcas){ 
    Query q = em.createQuery("SELECT m.id, m.descripcion FROM Modelos m WHERE m.idMarca.id = :idMarca"); 
    q.setParameter("idMarca", marcas.getId()); 
    return q.getResultList(); 
} 

Mais Je n'utiliserais pas de projections ou utiliserais une expression de constructeur SELECT NEW:

public List<Modelos> findByMarcas(Marcas marcas){ 
    Query q = em.createQuery("SELECT m FROM Modelos m WHERE m.idMarca.id = :idMarca"); 
    q.setParameter("idMarca", marcas.getId()); 
    return q.getResultList(); 
} 

ou (en supposant Modelos a un constructeur approprié):

public List<Modelos> findByMarcas(Marcas marcas){ 
    Query q = em.createQuery("SELECT NEW com.acme.Modelos(m.id, m.descripcion) FROM Modelos m WHERE m.idMarca.id = :idMarca"); 
    q.setParameter("idMarca", marcas.getId()); 
    return q.getResultList(); 
} 

Et en fait, j'utiliser une requête nommée, par exemple:

@NamedQuery(
    name="Modelos.findByMarcas", 
    query="SELECT m FROM Modelos m WHERE m.idMarca = :marcas" 
) 

et utilisation:

public List<Modelos> findByMarcas(Marcas marcas){ 
    Query q = em.createNamedQuery("Modelos.findByMarcas"); 
    q.setParameter("marcas", marcas); 
    return q.getResultList(); 
} 

D'ailleurs, je le ferais renommer idMarca en marcas sur l'entité Modelos, idMarca est trompeur:

@ManyToOne(optional = false) 
private Marcas marcas; 
+0

Crytal Clair! Je suis vraiment très reconnaissant! appliquera les changements dès maintenant (en fait dès que le match de l'Argentine sera terminé) mais merci encore beaucoup. Je vous laisse savoir comment ça marche! –

+0

De rien, content que vous ayez trouvé cela utile. Et laissez-moi savoir si le problème n'est pas résolu. –

+0

Problème résolu merci beaucoup! –