하 이 버 네 이 트 세 가지 상태 와 세 션 에서 많이 쓰 는 방법.

4203 단어 hibernatesession
우 리 는 hibenate 의 핵심 이 바로 데이터 베 이 스 를 조작 하 는 것 이라는 것 을 알 고 있 습 니 다.그 안의 핵심 인 터 페 이 스 는 org.hibenate.ession 인터페이스 입 니 다.데이터 베 이 스 를 조작 하려 면 대상 이 전체 작업 에 속 하 는 상태(Transient,Persistent,Detached)를 잘 정리 해 야 합 니 다.마 병사 선생님 이 동 영상 에서 말 한 것 처럼 우 리 는 이 단어 들 을 굳이 파고 들 필요 가 없다.우 리 는 스스로 테스트 류 를 작성 하면 그들 사이 의 차이 점 을 구별 할 수 있다.
사실 세 가지 상 태 는 각자 그렇게 많이 정리 할 필요 가 없다.단지 중요 한 부분 은 Transient 상태 안의 대상 은 id 가 없다 는 것 이다.

session 에서 자주 사용 하 는 방법 은 save(),update(),saveOrUpdate(),get(),load(),delete(),clear(),flush()입 니 다.
그 중에서 대학 시절 에 저 는 get 과 load 방법 에 익숙 하지 않 았 습 니 다.억지로 외 워 서 시험 에서 문 제 를 풀 었 습 니 다.지금 생각해 보면 전혀 그 럴 필요 가 없습니다.우 리 는 설 정 된 hibenate 환경 에 따라 준 it 테스트 를 진행 할 수 있다.
우선 get()방법 으로 테스트 를 진행 하 겠 습 니 다.
여기 서 우 리 는 먼저 실체 클래스 를 만 듭 니 다.Student Entity.Java 와 데이터베이스 에 있 는 student 이 대응 하 는 것 입 니 다.

package com.cwnu.entities; 
import javax.persistence.*; 
import java.io.Serializable; 
/** 
 * Created by yangy on 2015/12/19. 
 */ 
@Table(name = "student") 
@Entity 
public class StudentEntity implements Serializable{ 
 private int id; 
 private String name; 
 @Id 
 @Column(name = "id") 
 @GeneratedValue(strategy = GenerationType.AUTO) 
 private int getId() { 
  return id; 
 } 
 public void setId(int id) { 
  this.id = id; 
 } 
 @Column(name = "name") 
 public String getName() { 
  return name; 
 } 
 public void setName(String name) { 
  this.name = name; 
 } 
} 
junit 류 는 모두 아이디어 컴 파일 환경 이 설정 되 어 있 습 니 다.여기 서 getCurrentSession()을 사용 하여 조작 하려 면 먼저 Junit 류 에@Transaction 주 해 를 추가 해 야 합 니 다.다음은 관련 테스트 방법 입 니 다.

 @Test 
public void testGetOrLoad() { 
 Session session = sessionFactory.getCurrentSession(); 
 StudentEntity student = (StudentEntity)session.get(StudentEntity.class, 1); 
 //StudentEntity student_load = (StudentEntity)session.load(StudentEntity.class,1); String name = student.getName(); 
} 
먼저 get 방법 을 테스트 합 니 다.우 리 는 일단 student 이라는 실체 조작 만 하면 get 방법 은 관련 sql 조회 문 구 를 출력 하 는 것 을 발 견 했 습 니 다.그리고 우 리 는 get 방법 을 설명 하고 load 방법 을 바 꾸 면 load 방법 은 student 이라는 실체 데 이 터 를 출력 하 는 데 해당 하 는 sql 문 구 를 출력 하지 않 았 습 니 다.그러나 우 리 는 student 류 를 조작 할 때 관련 문 구 를 출력 합 니 다.
그래서 우 리 는 get()과 load()사이 의 차 이 를 알 수 있다.
get()은 실행 할 때마다 sql 문 구 를 실행 합 니 다.지연 되 지 않 습 니 다.load()방법 은 우리 가 얻 은 실 체 를 조작 할 때 만 조 회 를 실시 하고 해당 하 는 실체 정 보 를 얻 을 수 있 습 니 다.load 방법 은 대리 대상(마 병 선생님 동 영상)을 되 돌려 줍 니 다.get 이 든 load 든 우선 1 급 캐 시(session)에 해당 하 는 값 이 있 는 지 확인 하고 없 으 면 데이터 베 이 스 를 찾 습 니 다.
clear()방법 은 session 에 있 는 캐 시 를 정리 하 는 것 입 니 다.이 방법 을 테스트 하면 아래 Junit 에 따라 테스트 할 수 있 습 니 다.

@Test 
 public void testClear() { 
  Session session = sessionFactory.getCurrentSession(); 
  session.get(StudentEntity.class,1); 
  session.clear(); 
  session.get(StudentEntity.class,1); 
 } 
만약 우리 가 session.clear()주석 을 지 웠 다 면,우 리 는 하나의 sql 문장 만 실 행 된 것 을 볼 수 있 을 것 이다
flush()방법 은 데이터 베 이 스 를 동기 화 하 는 문구 로 이 를 실행 한 후 바로 데이터 베 이 스 를 새로 고 치 는 것 입 니 다.대충 보면 그 안에 많은 것들 이 있 습 니 다.예 를 들 어 Flushmode 와 같은 것들 이 있 습 니 다.우 리 는 기본적으로 Flushmode.AUTO 를 설정 합 니 다.이것 은 수정 하지 않 고 앞으로 의 성능 을 향상 시 키 기 위해 서 입 니 다.사실 우리 가 업 무 를 수행 할 때,업무 가 완 료 된 후에 그것 은 우리 가 flush()방법 을 집행 하 는 것 을 도 울 것 이다.다만 우리 가 대규모 삽입 을 할 때 우 리 는 아래 의 조작 을 자주 볼 수 있다.

Session session = sessionFactory.openSession(); 
Transaction tx = session.beginTransaction();  
for ( int i=0; i<100000; i++ ) {  
Customer customer = new Customer(.....);  
session.save(customer);  
if ( i % 20 == 0 ) { 
//20, same as the JDBC batch size   
//flush a batch of inserts and release memory:   
session.flush();  
session.clear();  
}}  
tx.commit();session.close(); 
이렇게 하 는 목적 은 대량의 삽입 을 피하 고 session 에 메모리 가 넘 치 는 것 을 피 하 는 것 입 니 다.그래서 우 리 는 정 해진 시간 에 정리 하면 이 문 제 를 피 할 수 있 습 니 다.
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

좋은 웹페이지 즐겨찾기