Hibernate 프로 그래 밍 은 동적 전환 을 실현 합 니 다.

Hibernate 에서 SCHema 를 동적 으로 전환 하여 서로 다른 데이터 베 이 스 를 방문 하 는 몇 가지 방법 을 고려 할 수 있 습 니 다. 수 요 는 매우 간단 하고 똑 같은 조작 입 니 다. 예 를 들 어 표 구조 가 똑 같 고 프로그램 도 똑 같 지만 특정한 조건 에 따라 서로 다른 schema 에 대해 조작 해 야 합 니 다.예 를 들 어 현재 A 사 를 처리 하고 있다 면 SchemaA 에 데 이 터 를 저장 하고 현재 B 사 를 처리 하고 있다 면 SchemaB 에 데 이 터 를 저장 합 니 다.사실은 하나의 프로그램 으로 백 스테이지 의 동적 전환 을 실현 하 는 것 이다.저 는 여기 서 몇 가지 방법 을 제공 합 니 다. 여러분 스스로 상황 에 따라 고려 하면 모두 실현 할 수 있 습 니 다. 주 의 는 실현 이 고 정식 응용 에 적합 하지 않 습 니 다.방법 1: Hibernate 에 Schema 설정 이 있 는 맵 과 같은 설정 인자 가 있 습 니 다.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.csc.poimanager.dao.Poi" table="POI" schema="P_BEIJING">
        <id name="poiId" type="java.lang.Long">
            <column name="POI_ID" precision="10" scale="0" />
            <generator class="increment" />
        </id>
        <property name="cnName" type="java.lang.String">
            <column name="CN_NAME" length="1000" />
        </property>
    </class>
</hibernate-mapping> 
 
그 중의 schema = 'P BEIJING' 이 Schema 를 죽 였 다 고 썼 다.이 부분 을 쓰 지 않 고 시스템 설정 인자 < property name = "hibenate. default schema" > POI 를 사용 할 수 있 습 니 다.BEIJING < / property > 이렇게 되면 우리 의 맵 파일 이 됩 니 다.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.csc.poimanager.dao.Poi" table="POI"">
        <id name="poiId" type="java.lang.Long">
            <column name="POI_ID" precision="10" scale="0" />
            <generator class="increment" />
        </id>
        <property name="cnName" type="java.lang.String">
            <column name="CN_NAME" length="1000" />
        </property>
    </class>
</hibernate-mapping>
 
호출 할 때 동적 으로 Schema 의 인 자 를 지정 하면 됩 니 다. 예 를 들 어
 public static SessionFactory rebuildSessionFactoryForChangeSchema(String newSchema){
        try {
            Properties p = configuration.getProperties();
            System.out.println("---" + p);
            p.put("hibernate.default_schema", newSchema);
            sessionFactory = configuration.buildSessionFactory();
            System.out.println(" change schema successfully ......... ");
            return sessionFactory;
        } catch (Exception e) {
            System.err
                    .println("%%%% rebuild session factory failed for changing schema %%%%");
            e.printStackTrace();
            return null;
        }
    }

 이 방법 은 전환 을 실현 할 수 있 지만, 우 리 는 매번 Session Factory 로 돌아 가 야 한다. 그렇지 않 으 면 동시에 문제 가 생 길 것 이다.왜냐하면 hibenate. defaultschema 시스템 은 하나 밖 에 없습니다.
 
방법 2: 다 중 설정 을 사용 합 니 다. 예 를 들 어 천진 과 베 이 징 에 대해 우 리 는 각각 해당 하 는 맵 파일 을 작성 합 니 다.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.csc.poimanager.dao.Poi" table="POI" id="P_BEIJING" schema="P_BEIJING">
        <id name="poiId" type="java.lang.Long">
            <column name="POI_ID" precision="10" scale="0" />
            <generator class="increment" />
        </id>
        <property name="cnName" type="java.lang.String">
            <column name="CN_NAME" length="1000" />
        </property>
    </class>
    <class name="com.csc.poimanager.dao.Poi" id="P_TIANJIN" table="POI" schema="P_TIANJIN">
        <id name="poiId" type="java.lang.Long">
            <column name="POI_ID" precision="10" scale="0" />
            <generator class="increment" />
        </id>
        <property name="cnName" type="java.lang.String">
            <column name="CN_NAME" length="1000" />
        </property>
    </class>
</hibernate-mapping>

 프로필 은 SCHEMA 와 ID 가 다른 것 을 제외 하고 완전히 같 습 니 다. 어떻게 사용 합 니까?sessionFactory.getBean("P"+placeName); 이렇게 하면 동적 호출 을 실현 할 수 있다.place Name 에 대해 서 는 프론트 호출 프로그램 을 통 해 전달 할 수도 있 고 Thread Local 에 넣 을 수도 있 습 니 다. 후 자 는 더욱 유 니 버 설 적 이 며 이전 프로그램 에 대한 수 정 량 이 가장 적 습 니 다. getPlace Name () 방법 만 쓰 면 되 기 때 문 입 니 다.방법 3: 데이터 뱅 크 의 연결 속성 을 수정 하고 예전 에 SchemaA 를 가리 키 던 것 을 SchemaB 로 바 꾸 려 면 권한 이 높 은 계 정 이 필요 합 니 다.사실은 더 간단 한 방법 이 있 습 니 다. 그것 은 바로 자신 이 DataSource 를 계승 한 다음 에 방법 에서 ThreadLocal 의 매개 변수 에 따라 서로 다른 데이터 연결 을 되 돌려 주 는 것 입 니 다.예 를 들 어 베 이 징 이 라면 베 이 징 데이터 소스 의 연결 을 되 돌려 주 고, TIANJIN 이 라면 톈 진 데이터 소스 의 연결 을 되 돌려 준다.시스템 을 사용 할 때 반드시 DataSource 에서 연결 을 얻 을 것 입 니 다. 우 리 는 내부 에서 분 배 를 했 고 자연 프론트 데스크 톱 의 운행 결과 도 분 배 됩 니 다.알림: DataSource 에 맵 < String, DataSource > 와 같은 구 조 를 포함 하여 내부 리 트 윗 을 할 수 있 습 니 다.개인 총화: 첫 번 째 방법 은 단기, 단일 스 레 드 에 만 적합 합 니 다.두 번 째 방법 은 상대 적 으로 기술 난이도 가 낮 습 니 다. 한 번 배치 할 때 여러 부 를 써 야 합 니 다. 유지 가 비교적 번 거 롭 습 니 다. 세 번 째 방법 은 기술 난이도 가 높 습 니 다. 유지 만 하면 간단 합 니 다. 저 는 개인 적 으로 세 번 째 방법 을 사용 합 니 다. 재 미 있 습 니 다.
 
IT 지식 망http://www.itwis.com) 상세 출처 참고:http://www.itwis.com/html/java/hibernate/20090824/5678.html

좋은 웹페이지 즐겨찾기