2013-08-08 1 views
8

사용자 지정 명명 전략 (테이블 이름 전용)을 구현하는 방법을 연구 할 때 나는 비 일관성을 발견했으나 해결할 수 없었습니다. (내가 PostgreSQL을 9.1.9로 보스 6.1.0.Final에 최대 절전 모드 코어 3.6.6.Final을 사용하고 있습니다)어떤 명명 전략이 기본값인지 최대 절전 모드

NamingStrategy 세 가지 내장 구현 것 같다 :

  1. DefaultNamingStrategy
  2. EJB3NamingStrategy
  3. ImprovedNamingStrategy

기본값은에 EJB3NamingStrategy로 설정 될 것으로 보인다.

그러나 테이블 이름은 위의 것과 일치하지 않는 전략에 따라 설정되는 것으로 보입니다.

예 :
클래스 이름 : package.ClassName
결과 테이블 이름 : classname

전략 1과 2는 단순히 단순히 모든 패키지 이름과 점을 제거 StringHelper.unqualify(className) 전화, 그래서 결과는 ClassName을해야합니다.

전략 3은 모든 패키지 이름과 점을 제거한 다음 각 camelcased 문자 앞에 밑줄을 넣고 마침내 소문자로 변환하여 class_name이됩니다.

(4.1.0.Final를 최대 절전 모드의 소스 코드는이 클래스에서 변경되지 않은 것 같다.)

는 는

는 그 누구도 날이 명확 도와 주 시겠어요?

답변

3

매우 쉽습니다! hibernate-core 3.6.6.Final으로 장난감 환경을 만드는 데 시간을 보내고 싶지 않으므로 사용 사례를 확인하는 방법을 알려 드리겠습니다. 작업 신청서에 정확히.

호스트에 visualvm을 설치하십시오. 로컬 응용 프로그램을위한 힙 덤프를 만들 수 있습니다. 힙 제거 서버에서 덤프 만들려면 - 서버에서 실행 : visualvm

jmap -dump:format=b,file=heap.dump $PID 

열기 덤프 및 OQL 쿼리를 실행

이름 지정 전략입니다
map(heap.objects('org.hibernate.cfg.Configuration'), "it.namingStrategyDelegator") 

. "인스턴스"탭을 사용하여 참조 계층을 탐색하여 hbm 또는 jpa NamingStrategy의 다른 실제 유형을 알 수 있습니다.

다른 버전의 Hibernate는 선언 된 필드와 타입이 다르다. 클래스가 최대 절전 모드의 버전에없는

heap.objects('org.hibernate.cfg.Configuration') 

경우 - 시도 문서 및 소스를 읽고 적절한 클래스를 찾을 : 더 namingStrategyDelegator 필드가없는 경우 인스턴스에 파고보십시오.

map(heap.objects('org.hibernate.cfg.Configuration'), "it.namingStrategyDelegator") 
     == org.hibernate.cfg.naming.LegacyNamingStrategyDelegator 

을하고 내부적으로 사용합니다 : 의존성 org.hibernate:hibernate-entitymanager:jar:4.3.11.Final

내가 가진

LegacyHbmNamingStrategyDelegate 
LegacyJpaNamingStrategyDelegate 

는 JPA 주석의 선물에 따라 달라집니다. 어떤 경우이든 LegacyNamingStrategyDelegator (예 : 주기적 참조) 인스턴스는 namingStrategy이고 인스턴스가 org.hibernate.cfg.EJB3NamingStrategy 인 필드를 참조합니다.

그 모두! 나는 1 분을 내 wepapp에 기본 명명 전략 구현을 찾고이 게시물을 쓰는 데 5 분 (

해피 해킹을 보내 주셔서 감사합니다.