1. 概要

CrudRepository は、特定のタイプのリポジトリでの一般的なCRUD操作用のSpringDataインターフェイスです。データベースと対話するためのいくつかのメソッドをすぐに使用できます。

このチュートリアルでは、 CrudRepository save()メソッドをいつどのように使用するかを説明します。

Spring Dataリポジトリの詳細については、CrudRepositoryをフレームワークの他のリポジトリインターフェイスと比較する記事をご覧ください。

2. 依存関係

SpringDataおよびH2データベースの依存関係をpom.xmlファイルに追加する必要があります。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

3. アプリケーション例

まず、MerchandiseEntityというSpringデータエンティティを作成しましょう。 このクラスは、save()メソッドを呼び出したときにデータベースに永続化されるデータ型を定義します。

@Entity
public class MerchandiseEntity {
 
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private double price;

    private String brand;

    public MerchandiseEntity() {
    }

    public MerchandiseEntity(String brand, double price) {
        this.brand = brand;
        this.price = price;
    }
}

次に、[X21X]MerchandiseEntityと連携するCrudRepositoryインターフェイスを作成しましょう。

@Repository
public interface InventoryRepository 
  extends CrudRepository<MerchandiseEntity, Long> {
}

ここでは、エンティティのクラスとエンティティIDのクラスであるMerchandiseEntityとLongを指定します。 このリポジトリのインスタンスがインスタンス化されると、MerchandiseEntityクラスを操作するための基盤となるロジックが自動的に配置されます。

したがって、ごくわずかなコードで、 save()メソッドの使用を開始できます。

4. CrudRepository save()を使用して、新しいインスタンスを追加します

MerchandiseEntity の新しいインスタンスを作成し、InventoryRepositoryを使用してデータベースに保存しましょう。

InventoryRepository repo = context
  .getBean(InventoryRepository.class);

MerchandiseEntity pants = new MerchandiseEntity(
  "Pair of Pants", BigDecimal.ONE);
pants = repo.save(pants);

これを実行すると、MerchandiseEntityのデータベーステーブルに新しいエントリが作成されます。 idを指定していないことに注意してください。 インスタンスは、最初はidnull値で作成され、 save()メソッドを呼び出すと、idは自動的に生成されます。

save()メソッドは、更新されたidフィールドを含む保存されたエンティティを返します。

5. CrudRepository save()を使用してインスタンスを更新します

同じsave()メソッドを使用して、データベースの既存のエントリを更新できます。 MerchandiseEntityインスタンスを特定のタイトルで保存したとします。

MerchandiseEntity pants = new MerchandiseEntity(
  "Pair of Pants", 34.99);
pants = repo.save(pants);

後で、アイテムの価格を更新したいと思いました。 次に、データベースからエンティティを取得して変更を加え、以前と同じように save()メソッドを使用できます。

アイテム( pantsId )の id がわかっているとすると、CRUDRepositoryメソッドfindByIdを使用して、データベースからエンティティを取得できます。 :

MerchandiseEntity pantsInDB = repo.findById(pantsId).get(); 
pantsInDB.setPrice(44.99); 
repo.save(pantsInDB);

ここでは、元のエンティティを新しい価格で更新し、変更をデータベースに保存しました。

トランザクションメソッド内のオブジェクトを更新するためにsave()を呼び出すことは必須ではないことに注意する必要があります

findById()を使用してトランザクションメソッド内のエンティティを取得する場合、返されるエンティティは永続性プロバイダーによって管理されます。 したがって、 save()メソッドを呼び出しているかどうかに関係なく、そのエンティティへの変更はデータベースに自動的に保持されます。 それでは、これを確認するための簡単なテストケースを作成しましょう。

@Test
@Transactional
public void shouldUpdateExistingEntryInDBWithoutSave() {
    MerchandiseEntity pants = new MerchandiseEntity(
      ORIGINAL_TITLE, BigDecimal.ONE);
    pants = repository.save(pants);

    Long originalId = pants.getId();

    // Update using setters
    pants.setTitle(UPDATED_TITLE);
    pants.setPrice(BigDecimal.TEN);
    pants.setBrand(UPDATED_BRAND);

    Optional<MerchandiseEntity> resultOp = repository.findById(originalId);

    assertTrue(resultOp.isPresent());
    MerchandiseEntity result = resultOp.get();

    assertEquals(originalId, result.getId());
    assertEquals(UPDATED_TITLE, result.getTitle());
    assertEquals(BigDecimal.TEN, result.getPrice());
    assertEquals(UPDATED_BRAND, result.getBrand());
}

6. 結論

この簡単な記事では、 CrudRepository のsave()メソッドの使用について説明しました。 このメソッドを使用して、データベースに新しいエントリを追加したり、既存のエントリを更新したりできます。

いつものように、記事のコードはGitHubにあります。