hibenate 차단기

백 엔 드 논리 개발 과정 에서 반드시 데이터 필드 가 중복 되 고 저장 해 야 합 니 다. 예 를 들 어 현재 사용자 가 주문 서 를 수정 하고 수정 자, 수정 시간 등 정 보 를 데이터베이스 에 기록 해 야 합 니 다. 이때 hibenate 차단 기 를 인용 하지 않 았 을 때 각 방법 에 해당 하 는 코드, 수정 자, 수정 시간 등 필드 정 보 를 추가 해 야 합 니 다.이런 공공 정보 에 대해 모든 수정 작업 은 중복 복 제 를 해 야 한다. 예 를 들 어 대형 전자상거래 사이트 에서 반드시 많은 조작 과 관련 되 고 표 구조 가 수백 수천 에 달 하면 수백 수천 에 달 하 는 배경 코드 에서 똑 같은 코드 를 복사 하여 값 을 부여 해 야 한다.
작업량 이 얼마 인지, 작업량 이 얼마 없 는 지 는 말 하지 않 고 복사 하면 된다.적어도 이것 은 불필요 한 코드 가 많 을 것 이다. 시스템 구조 에 있어 이것 은 처음부터 잘 처리 해 야 한다.이때 마침 히 베 네 이 트 차단기 가 나 타 났 다.이 동시에 이 차단 기 는 시스템 에 어떠한 영향 도 주지 않 고 수시로 제거 할 수 있 으 며 프레임 의 전체 성에 도 잘못된 영향 을 주지 않 으 며 완전히 삽입 하고 사용 할 수 있다.
package com.todaysteel.esaasfront.whs.common;


import java.io.Serializable;
import java.util.Date;

import org.apache.log4j.Logger;
import org.hibernate.EmptyInterceptor;
import org.hibernate.type.Type;
import org.springframework.stereotype.Component;

import com.todaysteel.core.utils.security.SpringSecurityUtils;
import com.todaysteel.esaasfront.publiccloud.commom.security.vo.Authorization;

/**
 * @author liuhaixiao
 * hibernate   :
 *      ,        ;
 *    ,        ;
 */
@Component
public class PropertyInterceptor extends EmptyInterceptor {

	private static final Logger log = Logger.getLogger(PropertyInterceptor.class);
	private static final long serialVersionUID = 1L;


	@Override
	public boolean onSave(Object entity, Serializable id, Object[] state,
		String[] propertyNames, Type[] types) {
		log.info("------Hibernate Interceptor-----onSave-----");
		Authorization user = SpringSecurityUtils.getCurrentUser();
		//    
		for (int index=0;index<propertyNames.length;index++) {
			//    "    "   
			if ("dadddate".equals(propertyNames[index])) {
	             //         "    "     
	        	if(state[index]==null){
	        		state[index] = new Date();
	        	}
	            continue;
	        } else if ("saddoperator".equals(propertyNames[index])) {//    "   "   
	        	//         "   "     
	        	if(state[index]==null){
	        		state[index] = user.getUsername();
	        	}
	            continue;
	        } 
		}
		return true;
	}


	@Override
	public boolean onFlushDirty(Object entity, Serializable id,
			Object[] currentState, Object[] previousState,
			String[] propertyNames, Type[] types) {
		log.info("------Hibernate Interceptor-----onFlushDirty-----");
		Authorization user = SpringSecurityUtils.getCurrentUser();
		//    
	     for (int index=0;index<propertyNames.length;index++) {
	         /*    "    "   */
	         if ("dmodifydate".equals(propertyNames[index])) {
	             /*         "    "     */
	        	 currentState[index] = new Date();
	             continue;
	         } else if ("smodifyoperator".equals(propertyNames[index])) {/*    "   "   */
	             /*         "   "     */
	        	 currentState[index] = user.getUsername();
	        	 continue;
	         } 
	     }
	
		 return true;
	}

}

 hibenate 는 많은 차단 기 를 제공 합 니 다. 실제 사용 해 야 원본 코드 를 볼 수 있 습 니 다. spring 과 유사 한 AOP 메커니즘 입 니 다.
마찬가지 로 전자상거래 사이트 가 로 그 를 감시 해 야 하 는 내용 도 이 차단기 로 사용 자 를 추적 할 수 있다.
물론 사용자 추적 로그 행 위 를 AOP 로 처리 하 는 것 이 좋 습 니 다.
 
저 는 설정 방식 으로 차단 기 를 사용 하기 때문에 xml 에서 설정 해 야 합 니 다.
<!--    hibernate      -->
	<bean id ="proInterceptor" class="com.todaysteel.esaasfront.whs.common.PropertyInterceptor" />

	<!-- Hibernate   -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="DynamicDataSource" />
		<property name="namingStrategy">
			<bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">${hibernate.dialect}</prop>
				<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
				<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
				<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
				<prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache/ehcache-hibernate-local.xml</prop>
			</props>
		</property>
		<property name="packagesToScan" value="com.todaysteel.esaasfront,com.todaysteel.core.business" />
		<property name="entityInterceptor" ref="proInterceptor"/>
	</bean>

 나 는 이 차단기 의 역할 영역 을 session 단계 에 두 었 기 때문에 sesisonFactory 에 설정 했다.
 
 
 
 
 

좋은 웹페이지 즐겨찾기