JPA + Hibernate4.1.6 + Spring3.1.2 + MySQL persist()不在DB中输入

时间:2012-12-21 13:31:43

标签: spring hibernate jpa

我能够检索数据,更新数据但仍然不能进入数据库。我想我错过了一些基本的东西。

* 编辑: * Jsut发现这一点,调用EntityManager.merge()也不会更新数据库。如果提供了更新查询,则会在数据库中更新这些值。

<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"
    scope="singleton" />
<bean id="jpaVendorAdapter"
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
    p:showSql="true" p:databasePlatform="org.hibernate.dialect.${DIALECT}"
    scope="singleton" />
<bean id="jpaEntityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    p:dataSource-ref="rbtDataSource" p:jpaDialect-ref="jpaDialect"
    p:jpaVendorAdapter-ref="jpaVendorAdapter"
    p:packagesToScan="com.onmobile.apps.ringbacktones.service.db.bean"
    scope="singleton" />

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
    p:entityManagerFactory-ref="jpaEntityManagerFactory" scope="singleton" />
<tx:annotation-driven transaction-manager="transactionManager" />

<!-- This automatically registers all Spring standard post-processors for 
    annotation-based configuration -->
<context:annotation-config />

<bean id="rbtDao" class="com.onmobile.apps.ringbacktones.service.db.dao.RBTDao"
    abstract="true" p:dbManager-ref="dbManager"></bean>
<bean id="categoryDao"
    class="com.onmobile.apps.ringbacktones.service.db.dao.impl.RBTCategoryDaoImpl"
    parent="rbtDao"></bean>

以下是rbtDao类的java代码

@Repository
public abstract class RBTDao<T extends RBTDto> {

@PersistenceContext
private EntityManager entityManager;

protected void save(T dtoBean) {
    getEntityManager().persist(dtoBean);
}
}

以下是categoryDao类

的java代码
@Repository
public class RBTCategoryDaoImpl extends RBTDao<Category> {
@Transactional
public void createCategory(Category category) {
    save(category);
}

Category是必须持久保存的bean类。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您的交易处理过多而且有点怀疑。首先,在调用堆栈中的适当位置处的一个@Transactional注释就足够了。此外,当您使用Springs注释驱动的事务方案时,既不需要也不应该执行显式的begin()/ commit()操作。另外,在flush()之前按照你的方式做commit(),我甚至不确定那会做什么,但这不对。

我的建议

  • 移除所有 @Transactional注释,但createCategory()方法
  • 除外
  • 删除明确的begin()commit()操作