使用@PersistenceContext获取EntityManager返回Null及配置咨询
我之前也踩过一模一样的坑,结合你给出的Spring JPA配置,咱们一步步来定位问题:
确保目标类在Spring容器管理范围内
你得确认使用@PersistenceContext的类是Spring托管的Bean——要么加了@Repository、@Service、@Component这类注解,要么在XML配置里显式定义了该类的Bean。如果类不在Spring容器中,Spring根本无法处理@PersistenceContext注解,注入自然会返回Null。核对persistenceUnitName的准确性
你的配置里persistenceUnitName写的是"streamJpaD...",看起来是被截断了。一定要保证这个值和persistence.xml里<persistence-unit name="xxx">的name完全一致,大小写、字符都不能有偏差,哪怕多一个空格都会导致找不到对应的持久化单元。检查persistence.xml的位置和内容
- 你配置的
persistenceXmlLocation是classpath*:META-INF/persistence.xml,要确认这个文件确实在classpath下的META-INF目录里(比如Maven项目要放在src/main/resources/META-INF下)。 - 打开
persistence.xml,检查持久化单元配置:有没有指定正确的实体类(可以用<class>标签或者exclude-unlisted-classes="false"),provider是否设置为org.hibernate.jpa.HibernatePersistenceProvider(对应你用的HibernateJpaVendorAdapter)。
- 你配置的
确认EntityManagerFactory初始化是否正常
查看Spring启动日志,有没有关于entityManagerFactory初始化的报错——比如找不到持久化单元、数据库连接配置错误、实体类映射异常之类的。如果EntityManagerFactory本身没启动成功,那注入EntityManager必然是空值。检查注入方式的正确性
- 不要在静态变量上使用
@PersistenceContext,Spring不支持注入静态成员变量,换成普通成员变量试试。 - 可以临时换个方式验证:用
@Autowired注入EntityManagerFactory,然后手动创建EntityManager:
如果这样能拿到EntityManager,说明是@Autowired private EntityManagerFactory entityManagerFactory; // 在方法中调用 EntityManager em = entityManagerFactory.createEntityManager();@PersistenceContext的注入配置有问题;如果还是拿不到,那大概率是EntityManagerFactory的配置本身存在问题。
- 不要在静态变量上使用
检查Spring组件扫描范围
如果用注解驱动的Spring上下文,确认@ComponentScan的包范围包含了你使用@PersistenceContext的类;如果是XML配置,看看<context:component-scan>的base-package有没有覆盖到目标类所在的包。
内容的提问来源于stack exchange,提问作者Abhilash KS

