Java、Spring、Spring MVC を使用してデータベースのデータ整合性を向上させる:外部キー制約の挿入
Spring MVC 4 における外部キー制約挿入
このチュートリアルでは、Spring MVC 4 アプリケーションで外部キー制約を挿入する方法について説明します。外部キー制約は、データベース内の関連テーブル間のデータ整合性を保つために使用されます。
前提条件
このチュートリアルを開始する前に、次のものが必要です。
- Java 開発環境
- Maven または Gradle
- Spring Framework 4.x
- データベース (MySQL、PostgreSQL など)
使用するライブラリ
このチュートリアルでは、次のライブラリを使用します。
- Spring Data JPA
- Hibernate
手順
- エンティティクラスを作成する
まず、エンティティクラスを作成する必要があります。エンティティクラスは、データベース内のテーブルを表す Java クラスです。
@Entity
@Table(name = "customers")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@ManyToOne
@JoinColumn(name = "address_id")
private Address address;
// ... ゲッターとセッター
}
@Entity
@Table(name = "addresses")
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "street")
private String street;
@Column(name = "city")
private String city;
@Column(name = "state")
private String state;
@Column(name = "zip_code")
private String zipCode;
// ... ゲッターとセッター
}
- 外部キー制約を定義する
Customer
エンティティクラスの address
フィールドに、Address
エンティティクラスへの外部キー制約を定義する必要があります。
@ManyToOne
@JoinColumn(name = "address_id", nullable = false)
private Address address;
- アプリケーションを実行する
これらの手順が完了したら、アプリケーションを実行できます。Spring Data JPA は、データベースとの接続を自動的に確立し、エンティティクラスをデータベーステーブルにマッピングします。
テスト
アプリケーションを実行したら、次のコマンドを使用してデータベースにデータを挿入できます。
INSERT INTO customers (first_name, last_name, address_id)
VALUES ('John', 'Doe', 1);
@Entity
@Table(name = "customers")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@ManyToOne
@JoinColumn(name = "address_id", nullable = false)
private Address address;
// ... ゲッターとセッター
}
@Entity
@Table(name = "addresses")
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "street")
private String street;
@Column(name = "city")
private String city;
@Column(name = "state")
private String state;
@Column(name = "zip_code")
private String zipCode;
// ... ゲッターとセッター
}
アプリケーションクラス
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Autowired
private CustomerRepository customerRepository;
@Autowired
private AddressRepository addressRepository;
@PostConstruct
public void initData() {
Address address = new Address();
address.setStreet("123 Main Street");
address.setCity("Anytown");
address.setState("CA");
address.setZipCode("90210");
Customer customer = new Customer();
customer.setFirstName("John");
customer.setLastName("Doe");
customer.setAddress(address);
addressRepository.save(address);
customerRepository.save(customer);
}
}
リポジトリインターフェース
public interface CustomerRepository extends JpaRepository<Customer, Long> {
}
public interface AddressRepository extends JpaRepository<Address, Long> {
}
このコードの説明
Customer
エンティティクラスは、customers
テーブルを表します。このクラスには、id
、firstName
、lastName
、address
というフィールドがあります。address
フィールドは、Address
エンティティクラスへの外部キー制約です。Address
エンティティクラスは、addresses
テーブルを表します。このクラスには、id
、street
、city
、state
、zipCode
というフィールドがあります。Application
クラスは、Spring Boot アプリケーションのメインクラスです。このクラスには、main()
メソッドとinitData()
メソッドがあります。main()
メソッドは、Spring Boot アプリケーションを起動します。initData()
メソッドは、データベースにデータを挿入します。CustomerRepository
インターフェースは、Customer
エンティティクラス用のリポジトリです。このインターフェースには、save()
、findById()
などのメソッドがあります。
このコードを実行する方法
- このコードを Java プロジェクトに保存します。
- Maven または Gradle を使用してプロジェクトをビルドします。
このコードのテスト方法
- データベースクライアントを使用して、
customers
テーブルとaddresses
テーブルを表示します。 customers
テーブルには、id = 1
の顧客が 1 件あることを確認します。
- エラー処理を追加します。
- ロギングを追加します。
- 単体テストを書きます。
代替方法 1: @GeneratedValue アノテーションを使用する
@GeneratedValue
アノテーションを使用して、エンティティクラスの ID フィールドを自動的に生成できます。このアノテーションを使用すると、データベースとの接続を確立し、ID 値を生成する責任を Spring Data JPA に委ねることができます。
@Entity
@Table(name = "customers")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@ManyToOne
@JoinColumn(name = "address_id")
private Address address;
// ... ゲッターとセッター
}
このコードでは、id
フィールドに @GeneratedValue
アノテーションが追加されています。このアノテーションにより、Spring Data JPA はデータベースから ID 値を自動的に生成します。
代替方法 2: エンティティマネージャーを使用する
エンティティマネージャーを使用して、データベースにデータを挿入することもできます。エンティティマネージャーは、データベースとの接続を管理し、エンティティオブジェクトを永続化する責任を負います。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Autowired
private EntityManager entityManager;
@PostConstruct
public void initData() {
Address address = new Address();
address.setStreet("123 Main Street");
address.setCity("Anytown");
address.setState("CA");
address.setZipCode("90210");
Customer customer = new Customer();
customer.setFirstName("John");
customer.setLastName("Doe");
customer.setAddress(address);
entityManager.persist(address);
entityManager.persist(customer);
}
}
このコードでは、entityManager
インジェクションを使用してエンティティマネージャーを取得します。次に、persist()
メソッドを使用して、address
エンティティと customer
エンティティをデータベースに挿入します。
Spring MVC 4 アプリケーションで外部キー制約を挿入するには、いくつかの方法があります。どの方法を使用するかは、個々のニーズと好みによって異なります。
- Hibernate Validator を使用して、エンティティクラスの検証を追加できます。
- Spring Data JPA の
saveAndFlush()
メソッドを使用して、エンティティを保存し、データベースにフラッシュできます。 - カスタム SQL クエリを使用して、データベースにデータを挿入できます。
java spring spring-mvc