Spring JPA объекты не сохраняются в базе данных - PullRequest
3 голосов
/ 15 февраля 2012

Я столкнулся с некоторыми проблемами в Spring JPA.Я успешно настроил проект Spring JPA и могу запустить проект без каких-либо исключений.

Я намерен сохранить объекты в базе данных.Но когда я запускаю проект, он не сохраняется ни в базу данных, ни в какие-либо исключения.

В чем может быть проблема?Я также добавил много jar-файлов, связанных с hiberate, потому что они запускали исключения при запуске.Теперь я не получаю никаких исключений.Но сущности не сохраняются в базе данных.Я приложил свою конфигурацию Spring и классы Java.

конфигурация sprig

<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:osgi="http://www.springframework.org/schema/osgi"
        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/osgi
            http://www.springframework.org/schema/osgi/spring-osgi.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx.xsd"> 



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


        <!-- Connection Pool -->
     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="${jdbc.driverClass}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
     </bean>

     <!-- JPA EntityManagerFactory --> 
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
            p:dataSource-ref="dataSource">
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                    <property name="database" value="${jdbc.database}"/>
                    <property name="showSql" value="${jdbc.showSql}"/>                  
            </bean>     
        </property>
    </bean>

    <!-- Transaction manager for a single JPA EntityManagerFactory (alternative to JTA) -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
            p:entityManagerFactory-ref="entityManagerFactory"/>


        <!-- Activates various annotations to be detected in bean classes for eg @Autowired-->
        <context:annotation-config/>

      <!-- enable the configuration of transactional behavior based on annotations  -->
      <tx:annotation-driven transaction-manager="transactionManager"/>



     <!-- <context:component-scan base-package="com.vemanchery.timesheet.dao"/> -->
    <!-- Implementation Class -->   
    <bean id="employeeDao" class="com.test.dao.impl.EmployeeDao" />
 <!-- services -->
    <bean id="employeeService" class="com.test.service.impl.EmployeeService" >
        <property name="employeeDao" ref="employeeDao"/>
    </bean>

</beans>

DAO

package com.test.dao.impl;


import java.util.List;

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

import com.test.dao.interfaces.IEmployeeDao;
import com.test.model.interfaces.IEmployee;



//@Repository
//@Component
public class EmployeeDao implements IEmployeeDao{

    @PersistenceContext()
    private EntityManager entityManager ;

    @Override
    public boolean createEmployee(IEmployee employee) {     
        this.entityManager.persist(employee);

        return true;
    }


}

Сервисный уровень

package com.test.service.impl;

import org.springframework.beans.factory.annotation.Autowired;

import com.test.dao.impl.EmployeeDao;
import com.test.dao.interfaces.IEmployeeDao;
import com.test.model.interfaces.IEmployee;
import com.test.service.interfaces.IEmployeeService;

public class EmployeeService implements IEmployeeService{

    @Autowired
    IEmployeeDao employeeDao;

    public IEmployeeDao getEmployeeDao() {
        return employeeDao;
    }

    public void setEmployeeDao(IEmployeeDao employeeDao) {
        this.employeeDao = employeeDao;
    }

    /**
     * 
     */
    public boolean addEmployee(IEmployee employee){
        employeeDao.createEmployee(employee);       
        return false;
    }

}

Ответы [ 2 ]

2 голосов
/ 15 февраля 2012

Добавление @Transactional аннотации к вашему классу обслуживания или объектам, хранящим метод:

@Transactional
public boolean addEmployee(IEmployee employee){
    employeeDao.createEmployee(employee);       
    return false;
}

Добавление @Repository поверх вашего DAO также является хорошей идеей, но это не вызывает ваших проблем.

0 голосов
/ 15 февраля 2012

Включить обработку на основе аннотаций для сервиса и дао (я никогда не смешивал конфигурацию и аннотацию xml, поэтому не знаю, подходит ли конфигурация), и пометьте свой метод обслуживания

addEmployee @ Transactional

Надеюсь, это поможет

...