2010-12-07 49 views
7

我尝试使用Sun Java PetStore Demo。
在CatalogFacade类有以下注释:@PersistenceUnit注释将不会创建一个EntityManageFactory emf = null

@PersistenceUnit(unitName="myPetStorePU") 
private EntityManagerFactory emf; 

在CatalogFacade太阳的所有方法有:

EntityManager em = emf.createEntityManager(); 

但我得到了EMF一个空指针异常试图createEntityManager时。但是...如果我添加上面这条线以下行这样

EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("myPetStorePU"); 
    EntityManager em = emf.createEntityManager(); 

那么EMF被成功地创建和持久性单元myPetStorePU也成功地连接到数据库。所以它看起来像persistence.xml语法,并且它的位置是正确的。我想了解为什么注解不起作用,因为我认为有一个使用注释的原因,而不是在每个方法中添加createEntityManagerFactory行。

我的src/META-INF/persistence.xml文件看起来是这样的:

<persistence-unit name="myPetStorePU"> 
    <description>Petstore Persistence Unit</description> 
    <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider> 

    <class>com.sun.javaee.blueprints.petstore.model.Tag</class> 
    <class>com.sun.javaee.blueprints.petstore.model.SellerContactInfo</class> 
    <class>com.sun.javaee.blueprints.petstore.model.Product</class> 
    <class>com.sun.javaee.blueprints.petstore.model.Item</class> 
    <class>com.sun.javaee.blueprints.petstore.model.Category</class> 
    <class>com.sun.javaee.blueprints.petstore.model.Address</class> 
    <class>com.sun.javaee.blueprints.petstore.model.ZipLocation</class> 
    <properties> 
     <property name="toplink.jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/> 
     <property name="toplink.jdbc.url" value="jdbc:oracle:thin:@#############"/> 
     <property name="toplink.jdbc.user" value="####"/> 
     <property name="toplink.jdbc.password" value="#####"/> 
     <property name="toplink.logging.level" value="INFO"/> 
    </properties> 

</persistence-unit> 

编辑: CatalogFacade是在petstore.model包,并实现了ServletContextListener

<listener> 
    <listener-class>com.sun.javaee.blueprints.petstore.model.CatalogFacade</listener-class> 
</listener> 

in the index.jsp Sun有以下内容:

<% 
CatalogFacade cf = (CatalogFacade)config.getServletContext().getAttribute("CatalogFacade"); 
List<Tag> tags=cf.getTagsInChunk(0, 12); 
%> 


public List<Tag> getTagsInChunk(int start, int chunkSize) { 
//The next line is required since the @PersistenceUnit annotation at the top of this class does not work 
    EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("myPetStorePU"); 
    EntityManager em = emf.createEntityManager(); 
    System.out.println("Entity manager " + emf); 
    Query query = em.createQuery("SELECT t FROM Tag t ORDER BY t.refCount DESC, t.tag"); 
    List<Tag> tags = query.setFirstResult(start).setMaxResults(chunkSize).getResultList(); 
    em.close(); 
    return tags; 
} 
+2

告诉我们你是如何获得CatalogFacade`的`一个实例发生这种情况。它是什么 - 一个pojo,一个ejb或? – Bozho 2010-12-07 21:23:42

回答

10

如果注释的对象不是由容器(spring/CDI/EJB容器)管理的,则不会注入任何内容。

因此,根据您的环境,获取该对象的上下文实例。

如果您没有使用任何上述技术(spring/CDI/EJB) - 那么您不能使用@PersistenceUnit@PersistenceContext。使用手动方式获取单位。

+0

我使用Eclipse和Tomcat。 CatalogFacade是一个监听器。 – jeff 2010-12-07 22:03:07

0

对于一些原因,你persistence.xml

<provider>org.hibernate.ejb.HibernatePersistence</provider> 

使用这个当切换到

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 

修复问题