2016-02-29 72 views
0

早上好,我還是新的hibernate jpa和spring這是我製作的第一個projet,每次我嘗試執行它時,我都得到了npe。這是我的代碼配置hibernate jpa和彈簧mvc(entityManager始終爲空)

的applicationContext.xml

http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd「>

<bean id="dao" class="com.talan.springmvc.dao.AdminDaoImpl"> 
</bean> 


<bean id="metier" class="com.talan.springmvc.metier.AdminMetier"> 
    <property name="dao" ref="dao" /> 
</bean> 
<bean id="datasource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property> 
    <property name="url" value="jdbc:oracle:thin:@localhost:1521/XE"></property> 
    <property name="username" value="system"></property> 
    <property name="password" value="Islem1992"></property> 

</bean> 
<bean id="persistenceUnitManager" 
    class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"> 
    <property name="persistenceXmlLocations"> 
     <list> 
      <value>classpath*:META-INF/persistence.xml</value> 
     </list> 
    </property> 
    <property name="defaultDataSource" ref="datasource"></property> 
</bean> 
<bean id="entityManagerFactory 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitManager" ref="persistenceUnitManager"></property> 
    <property name="dataSource" ref="datasource" /> 
    <property name="persistenceUnitName" value="myapp"></property> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.hbm2ddl.auto">none</prop> 
      <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
     </props> 
    </property> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     </bean> 
    </property> 
</bean> 
<!-- <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="myapp"></property> </bean> --> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"></property> 
</bean> 
<tx:annotation-driven transaction-manager="transactionManager" /> 

persistence.xml

<persistence 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" 
    version="1.0"> 
    <persistence-unit name="myapp" 
     transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    </persistence-unit> 
</persistence> 

Test.java

package test;

import org.springframework.context.support.ClassPathXmlApplicationContext; 

import com.talan.springmvc.entities.Agence; 
import com.talan.springmvc.entities.User; 
import com.talan.springmvc.metier.IAdminMetier; 

public class Test { 
    public static void main(String[] args){ 

     ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"}); 
     IAdminMetier admin = (IAdminMetier) context.getBean("metier"); 
     User u = new User(1,"islem", "yeddes", "salesAgent"); 
     admin.addUser(u); 
    } 

} 
+0

這些天在教程網站上發現的大多數春季示例項目都過時了。對於全新的項目,我強烈建議使用Spring Boot –

+0

配置對我來說似乎很好。請向我們展示如何將實體管理器設置爲您的AdminDaoImpl bean。 –

+0

對不起,我遲到的答案 – yeddez

回答

0

我忘了後我DAO

package com.talan.springmvc.dao; 

import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 

import com.talan.springmvc.entities.User; 

public class AdminDaoImpl implements IAdminDao { 
    @PersistenceContext 
    private EntityManager em; 
    @Override 
    public User addUser(User u) { 
     em.persist(u); 
     return u; 
    } 



} 
+0

請問你能分享一下你的代碼嗎?我想看看並修復它? – Prateek

0

首先,有一個與您的數據源,這是無法處理DB連接數據庫池的問題。 org.springframework.jdbc.datasource.DriverManagerDataSource正在爲每個HttpRequest的一個新的連接,這是適合僅用於測試目的... 使用從Tomcat DBCP:

<dependency> 
    <groupId>org.apache.tomcat</groupId> 
    <artifactId>tomcat-dbcp</artifactId> 
    <version>8.0.32</version> 
</dependency> 

或從其他供應商爲c3p0vibur這能夠極大地處理該作業。其次,您需要添加@Service(「serviceName」)和一些@Autowired註釋,以便爲Spring IoC機制提供代碼依賴性。也許在你的服務中加入一些@ComponentScan(「com.talan.springmvc.dao」)。

在我的項目之一,我有一個與該定義的服務:

@Service("utilisateurService") 
public class UtilisateurService implements UserDetailsService { 

    public static final Logger logger = LoggerFactory.getLogger(UtilisateurService.class); 

    private EntityManager entityManager; 

    @PersistenceContext 
    public void setEntityManager(EntityManager newEm){ 
     this.entityManager = newEm; 
    } 


    @Override 
    @Transactional 
    public UserSpringSecurity loadUserByUsername(final String username) throws UsernameNotFoundException { 

    } 

    // etc. 

} 

當然還有一些豆子來定義我的「utitisateurService」。在XML:

<context:annotation-config /> 

<context:property-placeholder location="classpath:jdbc.properties" /> 

<bean id="dsn1" class="org.vibur.dbcp.ViburDBCPDataSource" 
       init-method="start" destroy-method="terminate"> 
    <property name="jdbcUrl" value="${jdbc.url}" /> 
    <property name="username" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}" /> 
    <property name="poolInitialSize" value="10" /> 
    <property name="poolMaxSize" value="50" /> 
    <property name="connectionIdleLimitInSeconds" value="30" /> 
    <property name="testConnectionQuery" value="SELECT 1" /> 
    <property name="logQueryExecutionLongerThanMs" value="500" /> 
    <property name="logStackTraceForLongQueryExecution" value="true" /> 
    <property name="statementCacheMaxSize" value="200" /> 
</bean> 


<bean id="crmEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" autowire="byName"> 
    <property name="persistenceUnitName" value="crmPersistenceUnit" /> 
    <property name="dataSource" ref="dsn1" /> 
    <property name="packagesToScan" value="crm.db.model" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
    </property> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
     </props> 
    </property> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="crmEmf"></property> 
</bean> 

<tx:annotation-driven proxy-target-class="true" mode="proxy" /> 

<bean id="persistenceExceptionTranslationPostProcessor" 
    class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /> 

<!-- Logging --> 
<bean id="loggerListener" 
    class="org.springframework.security.authentication.event.LoggerListener" /> 


<bean id="customAuthenticationProvider" class="crm.security.CustomAuthenticationProvider" /> 
<bean id="utilisateurService" class="crm.service.UtilisateurService"/> 

試試這種方式,並告訴我們它是否工作!

+0

不,我添加了依賴,我添加了方法setEntityManager,仍然是NPE – yeddez

+0

您是否設置了這個''? 我在applicationContext.xml文件中看不到它。 – ThierryB