Spring JPA实体不保存到数据库
Posted
技术标签:
【中文标题】Spring JPA实体不保存到数据库【英文标题】:Spring JPA entities not saving to database 【发布时间】:2012-03-06 13:59:38 【问题描述】:我在 Spring JPA 中遇到了一些问题。我成功配置了 Spring JPA 项目,并且能够毫无异常地运行该项目。
我打算将实体保存到数据库中。但是当我运行项目时,它既没有保存到数据库也没有抛出任何异常。
可能是什么问题?我还添加了许多与休眠相关的 jar 文件,因为它在我运行时抛出异常。现在我没有任何例外。但是实体不会保存到数据库中。我附上了我的 Spring 配置和 Java 类。
小枝配置
<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;
【问题讨论】:
【参考方案1】:在您的服务类或方法存储实体上添加@Transactional
注解:
@Transactional
public boolean addEmployee(IEmployee employee)
employeeDao.createEmployee(employee);
return false;
在您的 DAO 上添加 @Repository
也是一个好主意,但它不会导致您的问题。
【讨论】:
感谢您的回复。我添加了注释。现在我在线程“main”java.lang.ClassCastException 中得到一个异常 Exception: $Proxy14 cannot be cast to com.test.service.impl.EmployeeService at main.Main.main(Main.java:16) @user414967:使用IEmployeeService
接口everwyhere而不是实现或启用proxy-target-class选项。
@Tomaz 现在正在工作.. 非常感谢.. 还有一个疑问,如果 Spring JPA 意味着它必须包含在任何其他 ORM 框架中,对吗?没有 ORM 就无法实现结果对吗?因为它现在是一个巨大的文件,包含很多 jar 文件..
@user414967:首先您使用的是Spring support for JPA,而不是Spring JPA 项目(我可以推荐)。是的,你需要 JPA API 和一些 JPA 实现,比如 Hibernate。不幸的是,Hibernate JAR 非常重。如果您还有其他问题,请在 SO 上打开另一个问题 - 否则 cmets 和建议将在这里丢失。【参考方案2】:
为服务和dao启用基于注释的处理(我从未混合过xml配置和注释,所以不知道配置设置是否正确)并标记您的服务方法
addEmployee @Transactional
希望对你有帮助
【讨论】:
【参考方案3】:我也遇到过这样的问题。两种方法奏效。
我在Entity的所有参数构造方法中添加了super()
。
另一种方法是替换Repository文件中的JPA Repository 我写了 PagingAndSortingRepository。
@Repository
public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Long>
long:employeeId 数据类型
【讨论】:
以上是关于Spring JPA实体不保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章
Spring Data Jpa:保存方法仅返回选择,但不执行插入
如何使用 Spring Data JPA 保存具有手动分配标识符的实体?