Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PersistenceContext未注入EntityManager_Java_Postgresql_Hibernate_Jpa - Fatal编程技术网

Java PersistenceContext未注入EntityManager

Java PersistenceContext未注入EntityManager,java,postgresql,hibernate,jpa,Java,Postgresql,Hibernate,Jpa,试图通过注释PersistenceContext访问EntityManager时,我收到一个NullPointerException import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.criteria.CriteriaBuilder; import javax.persis

试图通过注释
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;

    ...
}
路径
src/main/webapp/META-INF中的My
persistence.xml

<?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>
像这样直接获取EntityManager没有问题:

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jcrdb");
em = entityManagerFactory.createEntityManager();
我试着在jetty和tomEE运行这个

在我看来,ejb的东西似乎不起作用。我在这里遗漏了什么(所有这些都是新的)?

如果持久化单元是资源本地的,则必须使用EntityManagerFactory


您可以参考问题和答案了解完整的细节。

您从哪里获取
persistence.xml
文件?我知道如果您使用java配置(而不是XML配置),您可以如何选择它

您还需要设置数据源:

@Bean
public DataSource springJpaDataSource()
{
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUrl("jdbc:mysql://localhost/ABCXYZ");
dataSource.setUsername("tomcatUser");
dataSource.setPassword("password1234");
return dataSource;
}
此外,在配置文件上还需要@EnableTransactionManagement注释

如果您想摆脱persistence.xml并需要完全用java进行持久性配置,则需要将上面返回LocalContainerEntityManagerFactoryBean的内容替换为:

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean()
{
Map<String, Object> properties = new Hashtable<>();
properties.put("javax.persistence.schema-generation.database.action",
"none");
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect");
LocalContainerEntityManagerFactoryBean factory =
new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(adapter);
factory.setDataSource(this.springJpaDataSource());
factory.setPackagesToScan("com.wrox.site.entities");
factory.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
factory.setValidationMode(ValidationMode.NONE);
Configuring Persistence in Spring Framework ❘ 605
factory.setJpaPropertyMap(properties);
return factory;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean()
{
映射属性=新哈希表();
properties.put(“javax.persistence.schema generation.database.action”,
“无”);
HibernateJavaEndorapter适配器=新的HibernateJavaEndorapter();
setDatabasePlatform(“org.hibernate.dialent.mysql5innodbdialent”);
LocalContainerEntityManagerFactoryBean工厂=
新的LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(适配器);
setDataSource(this.springJpaDataSource());
setPackagesToScan(“com.wrox.site.entities”);
factory.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
setValidationMode(ValidationMode.NONE);
在Spring框架中配置持久性❘ 605
factory.SetJPapPropertyMap(属性);
返回工厂;
}

有时会发生这种情况,因为Spring没有注册。 要解决此问题,可以按如下方式手动定义:

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>


默认值将由
XML标记注册。

您使用的是spring吗??如果没有我还没有使用spring,请打印完整的堆栈跟踪。堆栈跟踪仅显示我的应用程序和服务器的初始化方法。NPE是根本原因。请查看此链接…我认为使用“@”无状态bean的配置存在问题。请查看谢谢此链接非常有用!我添加了两行,但是现在在访问emf时得到了一个NullPointerException。因此,我将坚持使用获取emf的编程版本。这样,我也可以保证只有一个EntityManager(就像在链接中建议的那样)。
@Bean
public DataSource springJpaDataSource()
{
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUrl("jdbc:mysql://localhost/ABCXYZ");
dataSource.setUsername("tomcatUser");
dataSource.setPassword("password1234");
return dataSource;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean()
{
Map<String, Object> properties = new Hashtable<>();
properties.put("javax.persistence.schema-generation.database.action",
"none");
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect");
LocalContainerEntityManagerFactoryBean factory =
new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(adapter);
factory.setDataSource(this.springJpaDataSource());
factory.setPackagesToScan("com.wrox.site.entities");
factory.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
factory.setValidationMode(ValidationMode.NONE);
Configuring Persistence in Spring Framework ❘ 605
factory.setJpaPropertyMap(properties);
return factory;
}
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>