JPA EntityManager未在Java EE应用程序中注入

时间:2014-10-07 22:31:59

标签: java hibernate java-ee jpa persistence

我收到的NullPointerException包含以下代码和配置,我不确定原因。我希望在调试此问题时提供一些帮助。

文件 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);

1 个答案:

答案 0 :(得分:1)

如果您只是AdDao newDao = new AdDaoImpl();,您的容器将无法知道注入EntityManager的位置。

如果您使用的是JBoss或Glassfish(或其他类型的EJB Containner),则需要将AdDao声明为EJB:

@Stateless
public class AdDao () {}

你将在你的servlet中使用它,如:

@EJB
public AdDao ejb;

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


如果您使用的是没有JPA的解决方案,您可以执行以下操作:     private static EntityManagerFactory emf = Persistence.createEntityManagerFactory(“YOUR_PERSISTENCE_UNIT”); //将它存储在你的班级

public void yourMethod(){
    final EntityManager entityManager = entityManagerFactory.createEntityManager();
    entityManager.getTransaction().begin();
    // do your stuff here
    entityManager.getTransaction().commit();
    entityManager.close();
}