2013-02-13 4 views
3

Я новичок весной. Я пытаюсь установить простое веб-приложение с Spring 3.1.3 и JPA 2.0 Я добавил все необходимые библиотеки в WEB-INF/lib. Во время запуска ошибок нет, но entityManager в моем файле DaoImpl имеет значение NULL. Итак, это моя конфигурация:Spring + JPA + Hibernate

persistance.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.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_2_0.xsd"> 

<persistence-unit name="fcmsServer" transaction-type="RESOURCE_LOCAL"> 
</persistence-unit> 
</persistence> 

FCMS-servlet.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/tx 
     http://www.springframework.org/schema/tx/spring-tx.xsd"> 

<!-- the application context definition for the fcmsServer DispatcherServlet --> 

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="fcmsServer" /> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="jpaDialect"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> 
    </property> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="showSql" value="true" /> 
      <property name="generateDdl" value="true" /> 
      <property name="databasePlatform" value="org.hibernate.dialect.H2Dialect" /> 
     </bean> 
    </property> 
    <property name="persistenceUnitManager"> 
     <bean 
      class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"> 
      <property name="defaultDataSource" ref="dataSource" /> 
     </bean> 
    </property> 
</bean> 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close"> 
    <property name="driverClassName" value="org.h2.Driver" /> 
    <property name="url" value="jdbc:h2:tcp://localhost/~/fcms" /> 
    <property name="username" value="sa" /> 
    <property name="password" value="sa" /> 
</bean> 

<tx:annotation-driven transaction-manager="transactionManager" /> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

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


<bean id="userDao" class="fcms.data.user.UserDAOImpl"> 
</bean> 

<bean name="/user.htm" class="fcms.controller.UserController"> 
</bean> 

<bean id="viewResolver" 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="viewClass" 
     value="org.springframework.web.servlet.view.JstlView"></property> 
    <property name="prefix" value="/WEB-INF/jsp/"></property> 
    <property name="suffix" value=".jsp"></property> 
</bean> 

класса DaoImpl:

@Repository 
public class UserDAOImpl implements UserDAO { 
@PersistenceContext(unitName = "fcmsServer") 
private EntityManager entityManager; 

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

@Override 
public User getUserById(long id) { 
    return entityManager.find(User.class,id); 
} 

@Override 
public void addUser(User u) { 
    entityManager.persist(u); 
} 
} 

кл пользователя задница

@Entity 
@Table(name = "User") 
public class User implements Serializable { 


@Id @GeneratedValue 
private long id; 
@Column(name = "lastName", nullable = false) 
private String lastName; 
@Column(name = "firstName", nullable = false) 
private String firstName; 
@Column(name = "birthDate", nullable = true) 
private Date birthDate; 
private static final long serialVersionUID = 1L; 

}

Так что, когда я пытаюсь вызвать AddUser() в UserController, у меня есть NullPointerException во время сохраняются.

+0

Подробнее. Когда я попытался получить entityManager вручную: EntityManager em = Persistence.createEntityManagerFactory ("fcmsServer"). CreateEntityManager(); У меня есть следующее исключение: org.hibernate.HibernateException: соединение не может быть пустым, если «hibernate.dialect» не установлен Возможно, это причина .. –

+0

Ваша конфигурация для вашего сущ .Manager неверна. И вам не нужно использовать имя punit для получения PersistenceContext, поскольку вы имеете дело только с ним. Вот пошаговое руководство о том, что вы пытаетесь сделать: http://www.pluralsight.com/training/Courses/TableOfContents/spring-jpa-hibernate – bh5k

+0

Попробуйте использовать Spring Boot в своем следующем проекте! Скорее всего, вы сможете избежать всех этих проблем! – geoand

ответ

2

Я думаю, вы пропустили конфигурацию, чтобы сказать весной искать аннотации (добавить следующее в любом месте между <beans> элемента:

<context:annotation-config /> 

А может быть, вам также необходимо добавить следующие указания пакета, в котором у вас есть DAO Но я не думаю, что это требуется

<context:component-scan base-package="your.package" /> 
+0

К сожалению, это решение не устраняет проблему. entityManager все равно равно null. –

1

это работает кусок кода:..

Spring.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context.xsd 
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 
     <context:annotation-config /> 
     <context:component-scan base-package="com.package.dao" /> 
     <tx:annotation-driven transaction-manager="transactionManager" /> 
     <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> 
       <property name="persistenceUnitName" value="fcmsServer" /> 
     </bean> 
     <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
       <property name="entityManagerFactory" ref="entityManagerFactory" /> 
     </bean>   
</beans> 

Dao боб:

@Repository 
public class UserDaoBean implements UserDao { 
     @PersistenceContext 
     protected EntityManager em;   
} 

persistence.xml:

<?xml version="1.0" encoding="UTF-8" ?> 
<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="fcmsServer" transaction-type="RESOURCE_LOCAL"> 

     <class>com.package.entity.</class> 
     <properties> 
      <property name="javax.persistence.jdbc.url" 
       value="jdbc:mysql://localhost:3306/db_name"/> 
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
      <property name="javax.persistence.jdbc.user" value="admin"/> 
      <property name="javax.persistence.jdbc.password" value="admin"/> 
     </properties> 
    </persistence-unit> 
</persistence> 
+0

Привет, Я также определяю entitymanagerfactory, как и ваш ut. Я не уверен, что мне следует указать на имя единицы сохранения = "fcmsServer". Что оно относится к? –

+0

@ Ferda-Ozdemir-Sonmez: имя единицы постоянства - это уникальный идентификатор вашей сущностиManagerFactory. Это полезно, когда любое приложение настраивает несколько баз данных/данных. Вы можете дать любое имя. –

Смежные вопросы