2014-10-07 55 views
1

我收到了一个带有以下代码和配置的NullPointerException,我不知道为什么。我希望在调试这个问题时有所帮助。JPA EntityManager没有被注入到Java EE应用程序中

文件的persistence.xml

<persistence-unit name="adismPersistenceUnit" transaction-type="RESOURCE_LOCAL" > 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>com.adism.domain.Ad</class> 
    <properties> 
     <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/adism" /> 
     <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" /> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" /> 
     <property name="hibernate.connection.username" value="root" /> 
     <property name="hibernate.connection.password" value="" /> 
    </properties> 

</persistence-unit> 

实体类:

@Entity @Table(name = "ads") public class Ad { 
    private Integer adId; 
    private String adTitle; 

    public Ad(){} 

    @Id 
    @Column(name="adid") 
    @GeneratedValue 
    public Integer getAdId(){ 
     return adId; 
    } 


    public void setAdId(Integer adId){ 
     this.adId = adId; 
    } 

    @Column(name="adtitle") 
    public String getAdTitle(){ 
     return this.adTitle; 
    } 

    public void setAdTitle(String title){ 
     this.adTitle = title; 
    } 

} 

DAO实现:

public class AdDaoImpl implements AdDao{ 

    @PersistenceContext 
    public EntityManager entityManager; 

    @Override 
    public void save(Ad ad){ 
    entityManager.persist(ad); 
    } 

}

当我运行下面的JSP代码,我得到NullPointerException异常

Ad ad = new Ad(); 
ad.setAdId(1000); 
ad.setAdTitle("JPA pure"); 
AdDao newDao = new AdDaoImpl(); 
newDao.save(ad); 
+0

你在哪里注射它? – uaiHebert 2014-10-07 22:36:59

+0

刚刚编辑的问题,我注入它像@PersistenceContext公共EntityManager entityManager; – 2014-10-07 22:39:02

+0

不知道:S第一次这样做 – 2014-10-07 22:44:31

回答

1

如果你只是做AdDao newDao = new AdDaoImpl();您的容器将不知道从哪里注入的EntityManager。

如果您正在使用JBoss或Glassfish的(或一些其它类型的EJB Containner的),你需要声明AdDao为EJB:

@Stateless 
public class AdDao() {} 

你会用它在你的servlet,如:

@EJB 
public AdDao ejb; 

PS .:我不会在控制器中注入DAO。最好的是在两者之间使用其他类,但是如果你对这种技术还不熟悉,那就从它开始。


如果您使用的是解决方案,而JPA,你可以这样做: 私有静态EntityManagerFactory的电动势= Persistence.createEntityManagerFactory( “YOUR_PERSISTENCE_UNIT”); //将它存储在你的班级

​​
+0

啊,我可能会做一些完全愚蠢的事情,我在想法中运行这个应用程序,并配置了tomcat,它是正确的组合吗? – 2014-10-07 22:50:29

+0

刚刚发现tomcat缺省情况下是cant主机EJB,它只是实现了Servlet规范。 – 2014-10-07 22:53:36

+0

有没有其他方法可以使用JPA? – 2014-10-07 22:54:06

相关问题