2017-10-10 17 views
1

私はSpringブートとJPAを使用します。春のブートのバージョンは1.5.7です。リリース。SpringブートJPA SQL文

ここで私は混乱しています。私が期待しているようにこれを動作させるにはどうすればいいですか?おかげ

UserRepositoryインタフェース:

package cn.alittler.cms.repository; 

import org.springframework.data.jpa.repository.JpaRepository; 

import cn.alittler.cms.domain.User; 

public interface UserRepository extends JpaRepository<User, Long> { 

} 

テストクラス:

package cn.alittler.cms.domain; 

import java.util.Date; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.test.context.SpringBootTest; 
import org.springframework.test.context.junit4.SpringRunner; 

import cn.alittler.cms.repository.UserRepository; 

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class UserTests { 

    @Autowired 
    UserRepository userRepository; 

    // three SQL statements: select、select and update. Why not two, the select and update SQL statements? 
    @Test 
    public void testUpdate() { 
     User user = userRepository.findOne(1L); 
     user.setName("Tom"); 
     user.setCreateTime(new Date()); 
     userRepository.save(user); 
    } 

    // Two SQL statements: select and update. Why not just one, the update SQL statement? 
    @Test 
    public void testUpdate2() { 
     User user = new User(); 
     user.setId(2L); 
     user.setName("Tomi"); 
     user.setCreateTime(new Date()); 
     userRepository.save(user); 
    } 

    // Two SQL statements: select and delete. Why not just one, the delete SQL statement? 
    @Test 
    public void testDelete() { 
     userRepository.delete(2L); 
    } 

} 

最初の試験方法testUpdate()は、そこに3つのSQL文、なぜ2、選択があると更新しますか?

Hibernate: 
    select 
     user0_.id as id1_0_0_, 
     user0_.create_time as create_t2_0_0_, 
     user0_.name as name3_0_0_ 
    from 
     alittler_cms_user user0_ 
    where 
     user0_.id=? 
Hibernate: 
    select 
     user0_.id as id1_0_0_, 
     user0_.create_time as create_t2_0_0_, 
     user0_.name as name3_0_0_ 
    from 
     alittler_cms_user user0_ 
    where 
     user0_.id=? 
Hibernate: 
    update 
     alittler_cms_user 
    set 
     create_time=?, 
     name=? 
    where 
     id=? 

第二の試験方法testUpdate2()、2つのSQLステートメント、なぜだけではなく

1、更新ステートメントがあるのですか?

Hibernate: 
    select 
     user0_.id as id1_0_0_, 
     user0_.create_time as create_t2_0_0_, 
     user0_.name as name3_0_0_ 
    from 
     alittler_cms_user user0_ 
    where 
     user0_.id=? 
Hibernate: 
    update 
     alittler_cms_user 
    set 
     create_time=?, 
     name=? 
    where 
     id=? 

最後のテスト方法testDelete()、2つのSQLステートメント、なぜ1つだけでなく、削除のSQL文もあるのですか?

Hibernate: 
    select 
     user0_.id as id1_0_0_, 
     user0_.create_time as create_t2_0_0_, 
     user0_.name as name3_0_0_ 
    from 
     alittler_cms_user user0_ 
    where 
     user0_.id=? 
Hibernate: 
    delete 
    from 
     alittler_cms_user 
    where 
     id=? 

ありがとう。

+1

JPAを使用し、テストはトランザクションではないためです。削除のために、休止状態は、削除する必要があるエンティティと関係、したがって選択を知る必要があります。他のものは、idとmergeが行われたためです。つまり、dbとメモリの状態がマージされます(selectがdb状態を取得するために行われます)。その後、更新されます。 –

答えて

0

このアノテーションなしでは、永続コンテキストが存在しないため、Hibernateは保存前にエンティティを読み取って存在するかどうかをチェックするため、テスト用に@Transactionalアノテーションを追加できます。 @Transactionalを追加すると、Hibernateは選択クエリUser user = userRepository.findOne(1L)を実行し、エンティティを永続コンテキストに保存し、追加の選択クエリを実行する必要はありません。

+0

テストクラスまたはテストメソッドの@Transactionalアノテーションを追加すると、SQL文が実行されず、SQLの選択のみが更新または削除されます。 –

関連する問題