未选中或操作不安全的实体 Bean



我正在学习实体豆,当我做实验时出现此错误。我选择为实体类(用于实体Product)创建一个会话 Bean。此文件由 NetBeans 自动创建。但它告知ProductsFacade.java uses unchecked or unsafe operations.

这是代码:

@Stateless
public class ProductsFacade implements ProductsFacadeRemote {
    @PersistenceContext(unitName = "NhungBHSE02082_SE0606_AdvJava_Lab10_11-ejbPU")
    private EntityManager em;
    public void create(Products products) {
        em.persist(products);
    }
    public void edit(Products products) {
        em.merge(products);`enter code here`
    }
    public void remove(Products products) {
        em.remove(em.merge(products));
    }
    public Products find(Object id) {
        return em.find(Products.class, id);
    }
    public List<Products> findAll() {
        return em.createQuery("select object(o) from Products as o").getResultList();
    }
    public List<Products> findRange(int[] range) {
        Query q = em.createQuery("select object(o) from Products as o");
        q.setMaxResults(range[1] - range[0]);
        q.setFirstResult(range[0]);
        return q.getResultList();
    }
    public int count() {
        return ((Long) em.createQuery("select count(o) from Products as o").getSingleResult()).intValue();
    }
}
警告

是由于以下方法造成的:

public List<Products> findAll() {
    return em.createQuery("select object(o) from Products as o").getResultList();
}
public List<Products> findRange(int[] range) {
    ...
    return q.getResultList();
}

内部发生的情况是query.getResultList()返回泛型List。列表中的每个对象都是 Products 的类型。你知道,但编译器不知道。只能在运行时确定类型。因此,编译器会显示未选中或不安全操作的警告。您可以放心地忽略此警告。

如果您真的很担心,则可以将注释@SuppressWarnings("unchecked")添加到这两种方法中,以使警告消失。

Query.getResultList返回非泛型List,并且隐式转换为List<Products>。现在,由于List是非泛型的,编译器没有必要的信息来确保它实际上是Products的列表。这就是编译器显示警告的原因。

即使编译器不知道,但你知道它实际上总是一个Products的列表,这保证了强制转换在运行时永远不会失败,所以你可以在这里用注释@SuppressWarnings("unchecked")装饰你的方法

@SuppressWarnings("unchecked")
public List<Products> findAll() {
    return em.createQuery("select object(o) from Products as o").getResultList();
}

这将消除警告。

另外:其他方法是使用TypedQuery

最新更新