0

私は典型的なSpring / Hibernateのセットアップをしています。これが私の春の設定です:

<context:annotation-config />

<context:component-scan base-package="com.myco.myapp.modules" />

<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="sessionFactory"
...     
</bean>

<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory" />
</bean>

私は BaseRepository を持っています:

@Transactional(propagation = Propagation.MANDATORY)
public final T save(final T entity) throws RepositoryException {
    try {
        getHibernateTemplate().save(entity);
        return entity;
    } catch (DataAccessException e) {
        throw new EntityCouldNotBeSavedException(getPersistentClass(),
            e);
    }
}

そして、それを拡張する Repository クラス:

@Repository
public class PersonRepositoryImpl extends BaseRepositoryImpl<Person, String>

そしてサービス:

@Service
public class PersonServiceImpl {
  @Autowired
  private PersonRepository _personRespository;

次のメソッド saveSomeStuff() を呼び出します。BaseRepository.save() を使用して挿入すると、完全に機能します。しかし、更新しようとしても、変更は行われません。

@Override
@Transactional
public void saveSomeStuff() {

    try {

        Person existingPerson = _personRespository.findById("1");

        existingPerson.setName("John");

        _personRespository.save(existingPerson);

        Person dbExistingPerson = _personRespository.findById("1");

        // This prints "John".
        System.out.println(dbExistingPerson.getName());

        Person newPerson = new Person();
        newPerson.setName("Jack");
        _personRespository.save(newPerson);

    } catch (RepositoryException e) {
        e1.printStackTrace();

    }
}

トランザクションの問題があるのではないかと思いましたが、前述したように、Service メソッドを終了すると、新しい Person がデータベースに保持されます。ログに次のように表示されます。

人に挿入...

ただし、私が行った更新は永続化されておらず、ログにエラーも 'update' sql ステートメントもありません。HibernateTemplate.save() メソッドが問題かもしれないと思いましたが、saveSomeStuff() メソッド内から、データベースから Person をロードした後、System.out を実行すると、データベースからロードされた Person の名前が更新されます。

ここで何が欠けていますか?

4

4 に答える 4

1

別の方法がありsaveOrUpdate(entity)ます。保存中に休止状態でIDを生成したくない場合に使用できます。

于 2013-02-26T14:35:05.943 に答える
0

Save メソッドはエンティティを永続化します。識別子が存在しない場合は、識別子を割り当てます。もしそうなら、それは本質的に更新を行っています。エンティティの生成された ID を返します。

于 2013-02-26T19:00:13.823 に答える
0

問題を理解しました。Entity クラスを含めていたら、おそらく誰かが私よりも早くそれを見たでしょう。

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
@Immutable
@Table(name = "PEOPLE")
public class Person {
  ...
}

最初はキャッシュエラーが発生していました:

java.lang.UnsupportedOperationException: Can't write to a readonly object

迅速な解決策は?@Immutable アノテーションを追加します。しかし、そのドキュメントを読むと:

An immutable entity may not be updated by the application. 
Updates to an immutable entity will be ignored, but no exception is thrown.

これは、1) 更新が無視され、2) 例外がスローされなかった理由を説明しています。

そこで、@Immutable アノテーションを取り除き、Cache を次のように変更しました。

 @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)

そして今、すべてがうまくいきます。

要約すると、rtfm.

于 2013-02-28T12:39:35.270 に答える