2017-01-05 5 views
1

Ich erhalte eine Nullpointer wenn die EntityManager über Anmerkung PersistenceContextPersistenceContext nicht Injizieren EntityManager

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; 

    ... 
} 

Mein persistence.xml in Pfad zuzugreifen versuchen 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> 

Die User -Klasse:

@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... 
} 

Es gibt kein Problem, das EntityManager direkt wie folgt erhalten:

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jcrdb"); 
em = entityManagerFactory.createEntityManager(); 

Ich habe versucht, dies in Steg und tomEE läuft.

Es scheint mir, dass das ejb-Zeug nicht funktioniert. Was fehlt mir hier (neu zu all dem)?

+0

verwenden Sie Feder ?? Drucken Sie einen vollen Stapel-Trace, wenn Sie – goodyzain

+0

haben Nein, ich benutze noch keinen Frühling. Der Stack-Trace zeigt nur die Initialisierungsmethoden meiner App und des Servers an. Die NPE ist die Ursache. – sotix

+0

werfen Sie einen Blick auf diesen Link ... Ich denke, das Problem mit den Konfigurationen mit '@' statuslose Bean werfen Sie einen Blick auf http://stackoverflow.com/questions/8544935/problems-in-injecting-entity-manager-into- Stateless-Bean – goodyzain

Antwort

2

EntityManagerFactory muss verwendet werden, wenn die anhaltende Einheit RESOURCE_LOCAL ist.

@PersistenceUnit  
private EntityManagerFactory emf; 

Sie könnten für die vollständigen Details this Fragen und Antworten beziehen.

+0

Vielen Dank der Link war sehr hilfreich! Ich habe die zwei Zeilen hinzugefügt, aber jetzt bekomme ich eine NullPointerException beim Zugriff auf EMF. Also bleibe ich bei der programmatischen Version der EMF. Auf diese Weise kann ich auch versichern, nur einen EntityManager zu haben (wie es in Ihrem Link vorgeschlagen wurde). – sotix

0

Woher nehmen Sie die Datei persistence.xml? Ich weiß, wie Sie es abholen können, wenn Sie Ihre Konfiguration in Java (anstelle von XML-Konfiguration) haben

@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() 
{ 
LocalContainerEntityManagerFactoryBean factory = 
new LocalContainerEntityManagerFactoryBean(); 
factory.setPersistenceXmlLocation(
"classpath:...../persistence.xml" 
); 
//factory.setPersistenceUnitName("whatever"); 
factory.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); 
factory.setDataSource(this.springJpaDataSource()); 
return factory; 
} 

Sie werden auch zur Einrichtung Datasource benötigen:

@Bean 
public DataSource springJpaDataSource() 
{ 
DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
dataSource.setUrl("jdbc:mysql://localhost/ABCXYZ"); 
dataSource.setUsername("tomcatUser"); 
dataSource.setPassword("password1234"); 
return dataSource; 
} 

Außerdem müssen Sie @EnableTransactionManagement Annotation über die Konfigurationsdatei

Wenn Sie persistence.xml loswerden wollen und die Persistenzkonfiguration vollständig in Java machen müssen, dann müssen Sie oben ersetzen, dass LocalContainerEntityManagerFactoryBean mit diesem zurückgibt:

@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; 
} 
Verwandte Themen