hibenate 세 가지 상태의 전환

5792 단어 hibernate
1.당 하 는 신기 한 일
jpa 를 사용 하여 데이터 베 이 스 를 조작 합 니 다.findAll()방법 으로 List 의 대상 을 찾 은 후에 이 list 의 실 체 를 조작 하 였 습 니 다.update 나 saveOrUpdate 방법 을 호출 하지 않 았 고 변 경 된 데 이 터 는 신기 하 게 데이터베이스 에 저장 되 었 습 니 다.
마지막 으로 간단 하고 거 친 해결 방법 은 이 걸 데이터 에서 찾 아 낸 List 입 니 다.  한 부 를 복사 한 후에 다시 조작 하고 되 돌 아 왔 다.데이터 가 정상 이 고 데이터 베이스 도 업데이트 되 지 않 았 다.뒤에서 자 료 를 찾 아 보 니 jpa 는 hibenate 에 대한 패키지 이 고,밑 에는 hibenate 이 며,이것 은 hibenate 의 지속 적 인 상태 에서 꾸 민 짓 이다.
2.hibenate 의 세 가지 상태
1.순간 상태(Transient)
자바 의 new 키 워드 를 통 해 실체 대상 을 만 들 때 이 실체 대상 은 자유 상태 에 있 습 니 다.다음 과 같 습 니 다.Customer customer=new Customer(“zx”,27,images);이때 customer 대상 은 자유 상태 인 데 왜 customer 대상 이 자유 상태 라 고 말 합 니까?이때 customer 는 JVM 을 통 해 메모리 공간 을 얻 었 을 뿐 Session 대상 의 save()방법 으로 데이터베이스 에 저장 되 지 않 았 기 때문에 Hibernate 의 캐 시 관리 에 포함 되 지 않 았 다.즉,customer 대상 은 현재 Hibernate 캐 시 관리 에서 자 유 롭 게 돌아 다 니 고 있 기 때문이다.그래서 우 리 는 자유 대상 의 가장 큰 특징 은 데이터 베이스 에 이에 대응 하 는 기록 이 존재 하지 않 는 다 는 것 을 알 수 있다.
순간 대상 특징:
  • 세 션 인 스 턴 스 와 관련 되 지 않 음
  • 데이터베이스 에 순간 대상 과 관련 된 기록 이 없습니다
  • 2.지속 상태(영구)
    지구 화 대상 은 데이터베이스 에 저 장 된 실체 대상 이 며,이 실체 대상 은 현재 Hibernate 의 캐 시 관리 에 있 습 니 다.이것 은 이 실체 대상 에 대한 모든 수정 으로 캐 시 를 정리 할 때 데이터베이스 에 동기 화 됩 니 다.다음 과 같다.
    
    Customer customer=new Customer(“zx”,27,images);
    tx=session.beginTransaction();
    session.save(customer);
    customer=(Customer)session.load(Customer.class,”1”);
    customer.setAge(28);
    tx.commit();
    이 때 우 리 는 session.update()방법 으로 업 데 이 트 를 저장 하 는 것 을 표시 하지 않 았 습 니 다.그러나 실체 대상 에 대한 수정 은 데이터베이스 에 동기 화 됩 니 다.이때 customer 대상 은 save 방법 으로 데이터 베 이 스 를 저장 한 후에 지구 화 대상 이 되 었 고 load 방법 으로 다시 불 러 옵 니 다.이것 은 여전히 지구 화 대상 이기 때 문 입 니 다.따라서 Hibernate 캐 시 관리 에 있 습 니 다.이 때 tx.commt()방법 을 실행 할 때 Hibernate 는 캐 시 를 자동 으로 정리 하고 영구적 인 대상 의 속성 변 화 를 데이터베이스 에 자동 으로 동기 화 합 니 다.
    지속 적 인 인 인 스 턴 스 는 데이터베이스 에 대응 하 는 기록 이 있 고 지속 적 인 표지(identifier)를 가지 고 있 습 니 다.
    지구 대상 은 항상 Session 과 Transaction 과 연결 되 어 있 습 니 다.한 Session 에서 지구 대상 의 변 화 는 데이터 베 이 스 를 바로 변경 하지 않 고 Transaction 이 종료 되 어야 합 니 다.즉,commt()를 실행 한 후에 야 데이터 베이스 에서 SQL 을 진정 으로 실행 하여 변경 하고 지구 대상 의 상 태 는 데이터 베이스 와 동기 화 됩 니 다.동기 화 되 기 전의 지속 적 인 대상 을 더러 운 대상 이 라 고 합 니 다.
    순간 대상 이 지속 대상 으로 전환:
  • 세 션 의 save()와 saveOrUpdate()방법 을 통 해 순간 대상 을 데이터베이스 와 연결 시 키 면 이 순간 대상 은 지구 화 대상 이 된다.
  • 은 fine(),get(),load()와 iterater()를 사용 하여 조회 할 데이터 대상 이 지구 화 대상 이 됩 니 다.
  • 지구 화 대상 의 특징:
  • 과 Session 인 스 턴 스 관련
  • 데이터베이스 에 지구 대상 과 관련 된 기록 이 있 습 니 다
  • 3.탈관 상태(Detached)
    지구 화 대상 이 하 이 버 네 이 트 의 캐 시 관리 에서 벗 어 나 면 유리 상태 에 있 습 니 다.유리 대상 과 자유 대상 의 가장 큰 차이 점 은 유리 대상 이 데이터베이스 에 해당 하 는 기록 이 존재 할 수 있 습 니 다.다만 현재 이 유리 대상 은 하 이 버 네 이 트 의 캐 시 관리 에서 벗 어 났 습 니 다.자유 대상 은 데이터베이스 에 해당 하 는 데이터 기록 이 나타 나 지 않 는 다.다음 과 같다.
    
    Customer customer=new Customer(“zx”,27,images);
    tx=session.beginTransaction();
    session.save(customer);
    customer=(Customer)session.load(Customer.class,”1”);
    customer.setAge(28);
    tx.commit();
    session.close();
    session 이 닫 히 면 customer 대상 은 Hibernate 의 캐 시 관리 에 있 지 않 습 니 다.그러나 이때 데이터베이스 에 customer 대상 과 대응 하 는 데이터 기록 이 존재 하기 때문에 이때 customer 대상 은 유리 상태 에 있 습 니 다.
    지구 대상 과 연 결 된 세 션 이 닫 히 면 대상 이 탈 관 대상 이 된다.탈 관 대상 에 대한 인용 은 여전히 유효 하 며 대상 은 계속 수정 할 수 있다.
    탈 관 대상 특징:
  • 은 본질 적 으로 순간 대상 과 같다
  • 은 사랑 의 순간 대상 보다 데이터베이스 기록 표지 값 id 가 많 을 뿐 입 니 다.
  • 지구 대상 이 탈 관 대상 으로 전환:
    close()나 clear(),evict()를 실행 하면 영구적 인 대상 이 탈 관 대상 이 됩 니 다.
    순간 대상 이 지속 대상 으로 전환:
    세 션 의 update(),saveOrUpdate(),lock()등 을 통 해 탈 관 대상 을 영구적 인 대상 으로 바 꿉 니 다.
    세 가지 상태의 전환

    예 를 들다
    1.save(),update(),saveOrUpdate()방법 과 결합 하여 대상 의 상 태 를 설명 합 니 다.
    (1)Save()방법 은 순간 대상 을 데이터베이스 에 저장 하고 대상 의 임시 상 태 는 지구 화 상태 로 변 한다.대상 이 영구적 인 상태 에 있 을 때 세 션 캐 시 에 있 습 니 다.모든 작업 은 트 랜 잭 션 을 제출 할 때 데이터베이스 에 동기 화 되 기 때문에 오래 지속 되 는 대상 에 게 save()나 update()방법 을 호출 하 는 것 은 의미 가 없습니다.예:
    
    Student stu = new Strudnet();
    stu.setCarId(“200234567”);
    stu.setId(“100”);
    //    Session,     
    session.save(stu);
    stu.setCardId(“20076548”);
    session.save(stu); //   
    session.update(stu); //   
    //     ,   Session
    
    (2)update()방법 두 가지 용도 로 탈 관 대상 을 지구 화 상태 대상 으로 업데이트 대상 을 표시 합 니 다.update()를 호출 하 는 것 은 하나의 탈 관 대상 을 지속 상태 로 연결 하기 위해 서 입 니 다.대상 이 이미 지속 상태 일 때 update()를 호출 하 는 것 은 큰 의미 가 없습니다.예:
    
    //    session ,     
    stu = (Student)session.get(Student.class,”123456”);
    stu.setName(“Body”);
    session.update(stu); //    stu      ,     Session    ,
      stu        //         。   update()       ,           。
    //     ,   Session
    Hibernate      update   ,            Session         ,       Hibernate       update   ,                  , :
    Student stu = new Strudnet();
    stu.setCarId(“1234”);
    //    Session1,     
    session1.save(stu);
    //     ,   Session1
    stu.set(“4567”); //          
    //    Session2,     
    session2.update(stu);
    //     ,   Session2
    
    주:session 2.update(stu)를이 문 구 는 삭제 되 었 습 니 다.사 무 를 제출 할 때 update()문 구 를 실행 합 니 다.
    탈 관 대상 만 바 뀌 기 를 원한 다 면 Hibernate 에서 만 update 문 구 를 생 성 할 수 있 습 니 다.맵 파일 에 있 는태그 의 select-before-update 를 true 로 설정 할 수 있 습 니 다.이 문 구 는 먼저 selection 문 구 를 보 내 데이터베이스 에 있 는 값 을 가 져 오고 값 이 같 는 지 판단 할 수 있 습 니 다.같 으 면 update 문 구 를 실행 하지 않 습 니 다.그러나 이러한 방법 은 어느 정도 단점 이 있 습 니 다.매번 update 문 구 를 보 내기 전에 불필요 한 selection 문 구 를 보 내 성능 에 영향 을 줍 니 다.가끔 바 뀌 는 클래스 에 대해 서 는 설정 이 효과 적 이 고 자주 바 꿔 야 할 클래스 에 대해 서 는 효율 에 영향 을 줍 니 다.
    (3)saveOrUpdate()방법 은 save()와 update()방법의 기능 을 겸비 하고 있 으 며,들 어 오 는 대상 에 대해 saveOrUpdate()는 우선 탈 관 대상 인지 임시 대상 인지 판단 한 다음 에 적합 한 방법 을 사용한다.
    이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

    좋은 웹페이지 즐겨찾기