2

Spring Data、JPA、および Hibernate を使用して Spring Web アプリケーションを実行しています。私は物事をテストしていて、サービス層の保存ステートメントを削除した後でもオブジェクトが保存されていることに気付きました。詳細は次のとおりです。

- - - データ - -

public interface FriendGroupRepository extends CrudRepository<FriendGroup, Long>, FriendGroupRepositoryCustom {
}

FriendGroupRepositoryCustom で定義されたメソッドは、私のテストでは使用されません。このテストには、CrudRepository インターフェースのメソッドが 1 つだけ含まれます。

- - - サービス - -

@Service
@Repository
@Transactional
public class AccountServiceImpl implements AccountService  {

@Override
@Transactional
public void saveFriendGroup(FriendGroup group) {
    friendGroupRepository.save(group);
}

}

friendGroupRepository.save(group); を削除した後 上記から、オブジェクトは引き続きデータベースに保存されます。デバッグとトレースを行い、フォームを送信したときにこのメソッドが実際に呼び出されたことを確認しました。

------ ウェブコントローラー ------

@RequestMapping(value={"/formtest"}, method=RequestMethod.POST)
public String formPost(HttpServletRequest request, 
    Model model, Map<String, Object> map,
        @ModelAttribute("command") FriendGroup fg,
        BindingResult result, 
        SessionStatus status ){

    ......
    accountService.saveFriendGroup(fg);     
    .......
}

私はかなり混乱していて、何が悪いのかわかりません。さらにコードや構成が必要な場合は、お知らせください。

助けてくれてありがとう!よろしく。

4

1 に答える 1

2

これは機能です。Hibernate のドキュメントを参照してください。

トランザクションの永続インスタンス (つまり、Session によってロード、保存、作成、または照会されたオブジェクト) は、アプリケーションによって操作でき、永続状態への変更は、Session がフラッシュされるときに永続化されます。これについては、この章で後述します。変更を永続化するために特定のメソッド (別の目的を持つ update() など) を呼び出す必要はありません。

Hibernate セッションは、読み込まれたすべてのエンティティのキ​​ャッシュを保持し、それらへの変更を追跡します。セッションがフラッシュされると、SQL 更新を発行してそれらの変更をデータベースに永続化します。したがって、オブジェクトが永続的な状態 (現在のセッションで読み込んだ) の場合、オブジェクトへの変更は、save を呼び出さなくても永続化されます。

于 2013-07-16T16:36:08.740 に答える