这是我的 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();
}
以及来自 Controller 的调用方法
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)
最佳答案
实际上,我几乎可以肯定服务器日志中有更多有用的痕迹。但无论如何,我有一些评论:
首先,id
的 Marca
不是 Modelos
的属性所以您的查询不正确,您需要传递一个实例或 Marcas
或者如果您通过 id
则浏览关联(使用 JPA 时需要考虑对象和关联)。
其次,您执行查询的方式不正确,您应该对其进行参数化。
第三,当使用 SQL 投影时,您会得到一个 Object[]
(或 List<Object[]>
如果有多个结果),除非您使用 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();
}
顺便说一下,我会重命名 idMarca
进入marcas
在 Modelos
上实体,idMarca
具有误导性:
@ManyToOne(optional = false)
private Marcas marcas;
关于java - EJB 无法更新数据模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3028817/