문제

현재 SQL Server에서 작업 중인 애플리케이션에 DAO 계층을 도입하겠습니다. 왜냐하면 이를 Oracle로 포팅해야 하기 때문입니다.

나는 배포 구성에 따라 올바른 DAO를 선택하기 위해 Hibernate를 사용하고 팩토리를 작성(또는 종속성 주입을 사용)하고 싶습니다.이 경우 모범 사례는 무엇입니까?서로 다른 hibernate.cfg.xml 및 *.hbm.xml 파일을 포함하는 두 개의 패키지가 있고 공장에서 그에 따라 선택해야 합니까?내 DAO가 (너무 많은) 번거로움 없이 두 DBMS 모두에서 올바르게 작동할 가능성이 있습니까?

도움이 되었습니까?

해결책

테이블 이름과 열이 둘 사이에 동일하다고 가정하면 동일하게 사용할 수 있어야합니다. hbm.xml 파일. 그러나 확실히 다른 최대 절전 모드 구성 값을 제공해야합니다 (hibernate.cfg.xml), 당신은 최대 절전 모드의 방언을 sqlserver에서 Oracle로 변경해야합니다.

둘 사이에 약간의 이름 차이가있는 경우 데이터베이스 서버 당 하나의 매핑 파일 세트를 만들고 별도의 항아리로 패키지합니다 (예 : yourproject-sqlserver-mappings.jar 그리고 yourproject-oracle-mappings.jar), 환경에 따라 한 항아리 또는 다른 항아리로 응용 프로그램을 배치하십시오.

다른 팁

나는 클라이언트를 위해 잠시 동안 이것을했다 - 배치시 production.properties 파일을 변경했습니다 hibernate.dialect 에서 cfg Ant를 사용하는 파일 (XML 변압기를 사용할 수 있음). 그러나 이것은 최대 절전 모드 코드가 SEAMLESS BTW 인 경우에만 작동합니다. 즉, DB- 특이 적 함수 호출 등 DBS IE NO DB 특이 적 기능 호출 등이 있습니다. UPPER(s), LENGTH(s) 등.

DB 구현이 반드시 다른 경우 @Matt가 제안한 것과 같은 일을해야합니다.

저는 많은 데이터베이스(Oracle, Informix, SQL Server, MySQL)를 지원하는 앱 작업을 해왔습니다.하나의 구성 파일과 하나의 매핑 세트가 있습니다.데이터베이스 연결에 jndi를 사용하므로 앱에서 다른 연결 URL을 처리할 필요가 없습니다.SessionFactory를 초기화할 때 기본 연결에서 데이터베이스 유형을 추론하는 메서드가 있습니다.예를 들어, JNDI를 통해 수동으로 연결을 얻은 다음 Connection.getMetaData().getDatabaseProductName()을 사용하여 데이터베이스가 무엇인지 알아보세요.컨테이너 환경 변수를 사용하여 명시적으로 설정할 수도 있습니다.그런 다음 Configuration.setProperty(Environment.DIALECT, deducedDialect)를 사용하여 방언을 설정하고 SessionFactory를 정상적으로 초기화합니다.

당신이 처리해야 할 몇 가지 사항:

  • 기본 키 생성.TableGenerator 전략의 사용자 정의 버전을 사용하므로 테이블 이름과 다음 키에 대한 열이 있는 하나의 키 테이블이 있습니다.이렇게 하면 모든 데이터베이스가 Oracle, SQL Server 등의 순서가 아닌 동일한 전략을 사용할 수 있습니다.
  • 데이터베이스에 특정한 기능.가능하다면 우리는 그것들을 피합니다.Hibernate 방언은 가장 일반적인 방언을 처리합니다.때때로 우리는 사용자 정의 방언 클래스에 우리 자신의 것을 추가해야 할 것입니다.날짜 산술은 꽤 비표준적이므로 함수 이름을 만들고 이를 각 데이터베이스의 수행 방식에 매핑할 것입니다.
  • 스키마 생성 - 우리는 Hibernate 스키마 생성 클래스를 사용합니다. 이는 방언과 함께 작동하여 각 데이터베이스 유형에 대해 올바른 DDL을 생성하고 데이터베이스가 매핑과 일치하도록 강제합니다.각 데이터베이스의 키워드를 알고 있어야 합니다.Oracle에 USER 테이블을 만들거나(USERS도 가능) MySQL에 TRANSLATION 테이블을 만들려고 하지 마세요.

여기에는 Oracle과 SQLServer의 차이점을 매핑하는 테이블 매핑이 있습니다. http://psoug.org/reference/sqlserver.html

제 생각에는 가장 큰 함정은 다음과 같습니다. 1) 날짜. 기능과 역학은 완전히 다릅니다. 각 DB마다 다른 코드를 사용해야합니다. 2) 키 생성 - Oracle과 SQLServer는 다른 역학을 사용하고 자신의 키 테이블을 사용하여 "기본"생성을 피하려고하면 모든 "삽입물"을 완전히 직렬화했습니다. 성능에 좋지 않습니다. 3) 동시성/잠금은 약간 다릅니다. 성능에 민감한 코드의 일부는 아마도 DB마다 다를 수 있습니다. 4) Oracle은 사례에 민감하며 SQLServer는 그렇지 않습니다. 당신은 그것에주의해야합니다.

더 많은 것이 있습니다 :) 두 DBS에서 실행될 SQL 코드를 작성하는 것은 어려운 일입니다. 빨리 만드는 것은 때때로 거의 불가능 해 보일 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top