JPA CRUD(+永続コンテキスト)


		EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); // /persistence.xml => <persistence-unit name="hello">
        EntityManager em = emf.createEntityManager(); //테이블 접근 시, 무조건 EntityManager 을 통해서 해야됨

        EntityTransaction transaction = em.getTransaction(); //JPA 에서의 모든 데이터 변경을 EntityTransaction 으로 이루어짐

        transaction.begin(); // 데이터베이스 transaction 을 시작
        em.createQuery("delete from Member").executeUpdate(); //실행 할때마다 테이블의 모든 튜플들 삭제
        transaction.commit();


        //Create
        Member memberA = new Member();
        memberA.setId(1L);
        memberA.setUsername("hello"); // Member 테이블에 저장할 튜플 생성

        Member memberB = new Member();
        memberB.setId(2L);
        memberB.setUsername("helloB"); // Member 테이블에 저장할 튜플 생성

        try {
            transaction.begin(); // 데이터베이스 transaction 을 시작; 이전에 transaction.commit()을 했으면 다시 begin()을 해줘야 함

            /**
             * Member 테이블에 memberA && memberB 객체들 적재
             */
            em.persist(memberA);
            em.persist(memberB);
            

            transaction.commit();
        } catch (Exception e) {
            transaction.rollback();
        }


        //Remove
        try {
            transaction.begin(); // 데이터베이스 transaction 을 시작

            /**
             * Column id로 원하는 튜플을 찾아서 객체로 반환 받고, 해당 객체를 제거
             */
            Member findMember = em.find(Member.class, 2L);
            em.remove(findMember);

            transaction.commit();
        } catch (Exception e) {
            transaction.rollback();
        }
        
        //Update
        try {
            transaction.begin(); // 데이터베이스 transaction 을 시작

            /**
             * Column id로 원하는 튜플을 찾아서 객체로 반환 받고, 해당 객체의 값을 수정
             */
            Member findMember = em.find(Member.class, 1L);
            findMember.setUsername("helloJPA"); // persist()을 하지 않아도 자동으로 테이블이 업데이트 됨

            transaction.commit(); //commit을 통해 변화 반영
        } catch (Exception e) {
            transaction.rollback();
        }


        try {
            /**
             * 쿼리문으로 원하는 값 찾기
             * select *from member
             */
            List<Member> memberList = em.createQuery("select m from Member as m", Member.class)
                    .getResultList();
            for (Member mem : memberList) {
                System.out.println("member.name = " + mem.getUsername());
            }

        } catch (Exception e) {

        }

        //항상 EntityManager랑 EntityManagerFactory를 close() 해줌
        em.close(); 
        emf.close();

  • オブジェクトを永続化として保存(オブジェクト)

  • remove(オブジェクト)を使用してテーブルからオブジェクトを削除するには

  • 変更するオブジェクトをfind(オブジェクト)として配置し、返されるオブジェクトの値を変更するときにテーブルで変更します.

  • テーブルにインスタンスをロード、削除、変更してコミットする必要があります()

  • エンティティーマネージャファクトリを1つ作成するだけで、アプリケーション間で共有できます.

  • エンティティーマネージャは、ねじ間でXを共有します(使用して破棄する必要があります).
  • ========「永続コンテキスト」(EntityManager)追加説明====

    EntityManager.永続化(オブジェクト)

    Member member = new Member();
    member.setId("member1");
    member.setUsername("회원1");
    
    //1차 캐시에 저장됨
    em.persist(member);

    EntityTransaction.commit()が発生するまで、エンティティはDBに格納されません.エンティティはメインキャッシュに格納され、Buffer SQLリポジトリにINSERT INTO SQL文が格納されます.

    EntityManager.find(オブジェクト)

    Member findMember2 = em.find(Member.class, "member2");
    //'member2' 가 1차 캐시에는 없고, 이미 DB에 저장되어 있는 상태

    まず、メインキャッシュでエンティティを検索し、ない場合はDBをクエリーします.
    DBにエンティティがある場合は、メインキャッシュに戻り、保存します.

    永続エンティティの一貫性の確保


    プライマリ・キャッシュの繰返し可能読み出しレベルを持つトランザクション
    データベース・レベルではなくアプリケーション・レベルでアプリケーション・アイソレーション・レベルを指定します.

    EntityManager.永続化(オブジェクト)->EntityTransaction。commit()

    em.persist(memberA);
    em.persist(memberB);
    //여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
    
    //커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
    transaction.commit(); 


    memberaエンティティとmemberbエンティティはメインキャッシュに格納され、EntityTransactionに格納されます.commit()が発生するまでDBには保存されません.まずメインキャッシュに格納され、各エンティティのINSERT INTO SQL文はBuffer SQLリポジトリに格納されます.
    commit()が発生した場合、Buffer SQLリポジトリに保存されているSQL文が実行されます.

    エンティティの変更

    // 영속 엔티티 조회
    Member memberA = em.find(Member.class, "memberA");
    // 영속 엔티티 데이터 수정
    memberA.setUsername("hi");
    memberA.setAge(10);
    
    transaction.commit();
  • setterを使用してエンティティを変更する->flush()をコミットする->エンティティとスナップショットを比較して変更したスナップショットを検索->UPDATE SQL文を作成してBuffer SQLリポジトリに保存->Buffer SQLリポジトリでSQL文を実行する->DBの変更部分は
  • を反映しています.