게 으 른 로드 이상 및 처리

3965 단어
게 으 른 로 딩: Hibernae 의 지연 로 딩 은 매우 자주 사용 하 는 기술 입 니 다. 실체의 집합 속성 은 기본적으로 로 딩 이 지연 되 고 실체 와 관련 된 실체 도 기본적으로 로 딩 이 지연 됩 니 다.Hibernate 는 이러한 지연 로 딩 을 통 해 시스템 의 메모리 소 비 를 낮 추어 Hibernate 의 운행 성능 을 확보 합 니 다.
Hibernate 가 데이터베이스 에서 어떤 지구 화 실 체 를 초기 화 할 때, 이 실체의 집합 속성 은 지구 화 클래스 와 함께 초기 화 됩 니까?집합 속성 에 10 만, 심지어 백만 의 기록 이 포함 되 어 있 으 면 지구 화 실 체 를 초기 화 하 는 동시에 모든 집합 속성 을 캡 처 하면 성능 이 급 격 히 떨어진다.시스템 은 집합 속성의 전부 가 아니 라 지구 화 된 집합 속성 중의 일부 기록 만 사용 할 수 있 습 니 다. 그러면 모든 집합 속성 을 한 번 에 불 러 올 필요 가 없습니다.
load () 방법의 게 으 름 로드 원리:
Hibernate 에서 조회 방법 은 두 가지 가 있 는데 그것 이 바로 get () 과 load () 이다. 이 두 가지 방법의 차이 점 은 load () 가 게 으 른 로 딩 의 특성 을 가지 고 있다 는 것 이다.Load () 방법 은 특정한 데 이 터 를 조회 할 때 이 데 이 터 를 지정 한 대상 으로 되 돌려 주지 않 고 이 대상 의 일부 속성 을 사용 해 야 할 때 만 데이터 베 이 스 를 방문 하여 데 이 터 를 얻 는 것 이다.그의 장점 은 프로그램 자체 가 데이터베이스 와 의 빈번 한 상호작용 으로 인 한 처리 속도 가 느리다 는 것 이다.
게 으 른 로드 이상 원인:
이 방법 을 호출 하고 조 회 된 프 록 시 대상 을 되 돌려 줍 니 다. 관련 대상 을 되 돌려 준 후 이 대상 의 name 속성 을 인쇄 합 니 다. 이 때 org. hibenate. Lazy InitializationException 이상 을 던 집 니 다.이것 은 게 으 른 로 딩 이 이상 을 초기 화 할 수 없다 는 것 입 니 다. 게 으 른 로 딩 을 할 때 대리 대상 을 통 해 데이터 베 이 스 를 조회 하려 면 이 session 이 닫 히 기 전에 해 야 합 니 다.그러나 세 션 종료 후 프 록 시 대상 을 꼭 사용 해 야 한다 면 Hibernate 에서 프 록 시 대상 을 초기 화 하 는 방법 initialize () 를 정의 합 니 다. 이 방법 을 통 해 프 록 시 대상 을 초기 화 할 수 있 습 니 다.
예 를 들다
방법 1: lazy = "false" 게 으 른 로 딩 닫 기: 로 딩 지연 기능 닫 기 (추천 하지 않 음)
1. JSP 페이지
		  <s:iterator value="#departmentList">
			<tr class="TableDetail1 template">
				<td width="20%">${name} </td>
				<td width="20%">${parent.name}</td>
				<td width="20%">${description} </td>
				<td width="40%">
					<s:a action="departmentAction_delete?id=%{id}" onclick="return confirm('           ,      ?')">  </s:a>
					<s:a action="departmentAction_editUI?id=%{id}">  </s:a>
					<a href="setPrivilegeUI.html">    </a>
				</td>
			</tr>
		</s:iterator>

2. 인 스 턴 스 (부서 표 자체 관련, 부서 와 부속 문 1 대 다 중 관계)
맵 파일
public class Department {
	/**  */
	private Long id;
	/**    */
	private String name;
	private String description;
	/**    */
	private Department parent;
	private Set<Department> children = new HashSet<Department>();
//   Getter Setter  
}

4. 데이터베이스 추출 작업
<class name="Department" table="department">
		<id name="id">
			<generator class="native" />
		</id>
		<property name="name" />
		<property name="description" />

		<!-- parent  ,   Department(  )     -->
		<!--    ,   " "    lazy="false"  -->
		<many-to-one name="parent" class="Department" column="parentId"<span style="color:#ff6666;"> lazy="false"</span>/>

		<!-- children  ,   Department(  )     order-by  :    sql orderby     -->
		<!-- cascade="delete"          -->
		<set name="children" cascade="delete" order-by="id ASC"<span style="color:#ff0000;"> lazy="false"</span>>
			<key column="parentId"></key>
			<one-to-many class="Department"/>
		</set>
	</class>
5.
Hibernate 프로필 에 다음 속성 추가
	public List<Department> findAll() {
		// TODO Auto-generated method stub
		//SQL           ,  Role      ,     
		//2.getSimpleName()    ,getName()    +  
		return getSession().createQuery(//
				"FROM Department" .list();
	}

방법 2: j 는 필터 에 의 해 제어 되 고 session 의 생명 주 기 를 연장 시 키 며 Session 닫 기 를 페이지 로 데 이 터 를 불 러 올 때 까지 연장 합 니 다.
<property name="hibernate.show_sql">true</property> 

좋은 웹페이지 즐겨찾기