JPAでは、EntityマネージャでEntityを操作することが、データベースを操作することになります。そのため、Entityマネージャが必要になります。取得したEntityマネージャでEntityを操作することで、データベースの検索、挿入、更新、削除に相当する操作を行うことができます。
ポイント
厳密には、Entityマネージャによる操作は永続コンテキスト(メモリ内部に構築されたEntityの集まりのようなイメージ)に対して行われ、データベースとの同期はトランザクションの区切りのタイミングで行われます。
Entityマネージャの取得
Entityマネージャを取得する場合は、以下のように@PersistenceContextアノテーションを使用します。
PersistenceContextアノテーションの使用例
| @PersistenceContext private EntityManager em; | 
Entityマネージャによる永続コンテキストの操作
Entityマネージャによる永続コンテキストを操作する例を、以下に示します。
Entityの主キーによる検索
EMPLOYEEテーブルからID(主キー)を指定して対応する従業員を検索する例を示します。Entityマネージャのfindメソッドにエンティティクラスと主キーの値を指定して検索します。
Entityの主キーによる検索例
| public Employee getEmployeeByPrimaryKey (int id) {
    return em.find(Employee.class, id);
} | 
EntityのJava Persistence Query Languageによる検索
EMPLOYEEテーブルから名前が一致する従業員を検索する例を示します。EntityマネージャのcreateQueryメソッドでクエリを作成してパラメタを設定してから実行し、検索結果を取得しています。
EntityのJava Persistence Query Languageによる検索例
| public Collection<Employee> getEmployeeByName (String name) {
    Query query = em.createQuery("SELECT employee FROM Employee employee WHERE employee.name = :name");
    query.setParameter("name" ,name);
    return query.getResultList();
} | 
Entityの挿入
EMPLOYEEテーブルに新しい従業員を追加する例を示します。エンティティクラス(Employee)のインスタンスを作成し、Entityマネージャのpersistメソッドで永続コンテキストに追加します。
Entityの挿入例
| public void insertEmployee (int id, String name, String address, String tel) {
    Employee newEmployee = new Employee(id, name, address, tel);
    em.persist(newEmployee);
} | 
Entityの更新
EMPLOYEEテーブルからID(主キー)を指定して対応する従業員を検索し、住所と電話番号を変更する例を示します。Entityマネージャのfindメソッドで検索し、エンティティクラスの値を変更します。
Entityの更新例
| public void updateEmployee (int id, String address, String tel) {
    Employee employee = em.find(Employee.class, id);
    employee.setAddress(address);
    employee.setTel(tel);
} | 
ポイント
永続コンテキスト内での変更のため、Entityのインスタンスを変更するだけで自動的に変更が検出されます。
永続コンテキスト外のインスタンスを更新した場合(例えば、上述したgetEmployeeByPrimaryKeyメソッドの復帰値のインスタンスを更新するような場合)にはEntityマネージャのmergeメソッドを呼び出し、永続コンテキストに変更を通知する必要があります。
Entityの削除
EMPLOYEEテーブルからID(主キー)を指定して対応する従業員を検索し、その従業員の情報を削除する例を示します。Entityマネージャのfindメソッドで検索したエンティティクラスのインスタンスを引数に指定してremoveメソッドを呼び出し、永続コンテキストから削除します。
Entityの主キーによる削除例
| public void deleteEmployee (int id) {
    Employee employee = em.find(Employee.class, id);
    em.remove(employee);
} |