【发布时间】:2017-05-19 17:59:39
【问题描述】:
我在尝试通过注释 PersistenceContext 访问 EntityManager 时遇到 NullPointerException
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
@Stateless
public class UserService {
@PersistenceContext(unitName = "jcrdb")
private EntityManager em;
...
}
我的persistence.xml在路径src/main/webapp/META-INF:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="jcrdb" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<!-- <jta-data-source>jdbc/jcrdb</jta-data-source> -->
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<!-- this tell Hibernate to update the DDL when it starts, very useful
for development, dangerous in production -->
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="javax.persistence.logging.level" value="INFO" />
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://127.0.0.1:5432/jcrdb" />
<property name="javax.persistence.jdbc.user" value="jcr_admin" />
<property name="javax.persistence.jdbc.password" value="q1w2e3r4" />
<!-- <property name="tomee.jpa.factory.lazy" value="true" />-->
</properties>
</persistence-unit>
</persistence>
User-class:
@Entity
@Table(name = "Users")
public class User {
@Id
@GeneratedValue(generator = "increment")
@GenericGenerator(name = "increment", strategy = "increment")
private int UserId;
private String alias;
private String email;
@OneToOne(fetch = FetchType.LAZY)
private Person person;
@OneToMany
private List<Role> roles;
public User() {
}
// constructor, getters, setters...
}
像这样直接获取EntityManager没有问题:
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jcrdb");
em = entityManagerFactory.createEntityManager();
我尝试在 jetty 和 tomEE 中运行它。
在我看来,ejb-stuff 不起作用。我在这里缺少什么(这一切都是新的)?
【问题讨论】:
-
你在用弹簧吗??如果有,则打印完整的堆栈跟踪
-
不,我还没有使用弹簧。堆栈跟踪仅显示我的应用程序和服务器的初始化方法。 NPE 是根本原因。
-
看看这个链接...我认为使用'@'stateless bean的配置问题看看stackoverflow.com/questions/8544935/…
标签: java postgresql hibernate jpa