【问题标题】:EJB failure to update datamodelEJB 更新数据模型失败
【发布时间】:2010-06-12 13:28:39
【问题描述】:

这是我的 EJB

@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 + "";
    }

}

以及从 Modelosfacade 访问的方法

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

以及来自控制器的调用方法

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

我不明白为什么我总是陷入 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)

【问题讨论】:

    标签: java jpa ejb eclipselink


    【解决方案1】:

    实际上,我几乎可以肯定服务器日志中有更多有用的痕迹。但无论如何,我有几点意见:

    首先,Marcaid 不是Modelos 的属性,因此您的查询不正确,您需要传递一个实例或Marcas,或者如果您通过关联导航通过id(使用JPA时需要考虑对象和关联)。

    其次,您执行查询的方式不正确,您应该对其进行参数化。

    第三,当使用 SQL 投影时,你会得到一个 Object[](如果有多个结果,则得到一个 List&lt;Object[]&gt;),而不是强类型化结果,除非你使用 SELECT NEW 构造函数表达式。

    总而言之,以下应该有效:

    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();
    }
    

    或者,如果你将id作为查询的参数传递(但上面的查询就可以了):

    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();
    }
    

    但我要么不使用投影,要么使用 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();
    }
    

    或者(假设Modelos有一个合适的构造函数):

    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();
    }
    

    实际上,我会使用命名查询,例如:

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

    并使用:

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

    顺便说一句,我会将Modelos 实体上的idMarca 重命名为marcasidMarca 具有误导性:

    @ManyToOne(optional = false)
    private Marcas marcas;
    

    【讨论】:

    • 晶莹剔透!我真的很感谢伟大的解释!将立即应用更改(实际上是在阿根廷的比赛结束后),但再次非常感谢您。我让你知道工作进展如何!
    • 不客气,很高兴您发现这很有帮助。如果问题没有解决,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多