하 이 버 네 이 트 세 가지 상태 와 세 션 에서 많이 쓰 는 방법.
사실 세 가지 상 태 는 각자 그렇게 많이 정리 할 필요 가 없다.단지 중요 한 부분 은 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 에 메모리 가 넘 치 는 것 을 피 하 는 것 입 니 다.그래서 우 리 는 정 해진 시간 에 정리 하면 이 문 제 를 피 할 수 있 습 니 다.이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA 및 PostgreSQL 텍스트다음은 의 친구들과 논의한 후 오랫동안 초안으로 작성한 블로그 게시물이며 ( ) 주제에 대한 훌륭한 기사를 작성했기 때문에 여기에 작은 테스트를 게시하고 있습니다. JPA 주석 없이 String를 선언합니다. 재현하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.