2016-02-29 69 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