2012-11-21 32 views
3

我正在学习Entity Bean,并在执行实验时遇到此错误。我选择创建实体类的会话Bean(实体Product)。该文件由NetBeans自动创建。不过它通知ProductsFacade.java uses unchecked or unsafe operations.未选中或不安全操作的实体bean

下面是代码:

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

将下面的init方法添加到类中。 Web容器通过调用其init方法来初始化servlet。在servlet加载完成之后以及开始为请求提供服务之前,这只会发生一次。 public void init()抛出ServletException异常{并将方法放置在其中查找对象。 –

回答

2

警告是由于以下几种方法:

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")添加到这两种方法中,以使警告消失。

+1

+1。这是对的。我的回答是错误的。 – kosa

+0

它返回'List'而不是'List '。如果是,它永远不会编译:http://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#cannotCast。 –

+0

@BheshGurung哦,是的。感谢您指出了这一点。 –

1

Query.getResultList回报List这是不通用的,并且是隐含被强制转换为List<Products>。现在,List是非通用的,编译器没有必要确保它实际上是Products列表的信息。这就是编译器显示警告的原因。

即使编译器不知道,但您知道它实际上总是会列出Products s,这确保了转换在运行时不会失败,因此您可以在此处使用注释@SuppressWarnings("unchecked")修饰您的方法

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

这将带走警告。其他方法是使用TypedQuery

+0

非常感谢! –

+0

不客气。 –

相关问题