0

データを取得して更新することはできますが、DB にエントリを作成しないままです。ここで基本的な何かが欠けていると思います。

*編集: * 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);
}

カテゴリは、永続化する必要がある Bean クラスです。

助けてくれてありがとう。

4

1 に答える 1

1

あなたの取引処理は過剰で、少し疑わしいです。まず、コール スタックの適切なポイントに @Transactional アノテーションが 1 つあれば十分です。また、Springs アノテーション駆動型トランザクション スキームを使用している場合は、明示的な begin()/commit() 操作を行う必要も、行うべきでもありません。また、あなたのやり方で commit() を flush() の前に行うと、それが何をするのかさえわかりませんが、正しくありません。

私のおすすめ

  • メソッドの @Transactional アノテーションを除くすべての@Transactional アノテーションを削除しますcreateCategory()
  • begin()明示的およびcommit()操作を削除します
于 2012-12-21T13:42:11.023 に答える