私はreadOnly Hibernateトランザクション内でオブジェクトを更新する必要があるこの非標準的な状況があります。物事は、私は多くの他のオブジェクトを読み込んで、そのトランザクション内でそれらを変更しますが、1つだけがロールバックされた状態で保存されるべきです。私が上で動作するデータベースは、PostgreSQL 8.4Spring + Hibernate + Postgresql readOnlyトランザクション、要求時保存
I`m私が正しくドキュメントを理解していないが、サービスメソッド作る:
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
は保存そのため、明示的に新しいRWトランザクションを開くことになるはずです。
主なものは、これが動作していませんされています。その後
@Transactional(readOnly = true)
public class PersonService {
@Resource(name="sessionFactory")
private SessionFactory sessionFactory;
public void add(Person person){
person.setFirstName("changed its name");
save(person);
}
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public void save(Person person) {
Session session = sessionFactory.getCurrentSession();
session.save(person);
session.flush();
}
}
を私は '追加' メソッドを呼び出して、コントローラから
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
を取得します。 'add'はreadOnlyモードであり、Personオブジェクトを 'save'メソッドに渡します。これは、新しいTransactionを開き、DBに保存する必要があります。 'add'メソッドの私のプロジェクトでは、私は他の多くの 'Person'オブジェクトがロードされていますが、これは保存すべきではありません。 私がreadOnlyメソッドを必要とする理由は、コード内でさらに多くのオブジェクトをロードすることです:)それらをロールバックすることは、私がしたい最後のことです。
このようにすることはできますか?
+1うん、それはうまくいけない理由です。 @Resource(name = "personService")private PersonService personServiceを追加してpersonService.save(person)を呼び出すと、正常に動作し、データベースに保持されました。どうもありがとう! – Krystian
ありがとうございました! :-) – Maciej