セルギBishyr:
私は、非常に奇妙な行動に気づいたsave(T entity)
のスプリング・データJpaRepositoryでを。
私は、エンティティを持っているFoo foo
と私はリポジトリとそれを保存しようとしていますfooRepository.save(foo)
。私の問題は、保存した後、のインスタンスであるfoo
私が渡していることsave()
方法が変更されます。私はこれを期待していない、と私はそれに関連するすべての問題を見つけることができないことを非常に奇妙です。
これは正常な動作ですか?
ティムBiegeleisen:
私たちは、最初にチェックすることで、あなたの観測を理解しようとすることができるCrudRepositoryのJavadocを:
指定されたエンティティを保存します。さらに操作のために返されたインスタンスを使用して保存操作を完全にエンティティインスタンスを変更している可能性があるとして。
ここでの一つの可能な説明は、あなたが保存したときに、いくつかの他のスレッドやプロセスも基礎となるエンティティを変更していたことです。ここでは何であるsave()
方法は、実際に行われます。
@Transactional
@Override
public <S extends T> S save(S entity) {
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity); // <-- this is your use case
}
}
これは、呼び出しますem.merge()
どんな新しい基礎となる変更がデータベース内のレコード/エンティティに行われていると返されました。だから、あなたは、バックグラウンドでこのエンティティを更新するかもしれない他に何を確認する必要があります。