hibernate, какая стратегия именования используется по умолчанию

Исследуя, как реализовать пользовательскую стратегию именования (только для имен таблиц), я наткнулся на несоответствие, которое не могу устранить. (Я использую hibernate-core 3.6.6.Final на JBoss 6.1.0.Final с PostgreSQL 9.1.9)

Кажется, есть три встроенных реализации для NamingStrategy:

  1. DefaultNamingStrategy
  2. EJB3NamingStrategy
  3. ImprovedNamingStrategy

По умолчанию, кажется, установлено значение EJB3NamingStrategy в org.hibernate.cfg.Configuration.

Однако имена таблиц, кажется, установлены в соответствии со стратегией, которая не соответствует ни одному из вышеперечисленных.

Пример:
Имя класса: package.ClassName
Результирующее имя таблицы: classname

Стратегии 1 и 2 просто вызывают StringHelper.unqualify( className ), что просто удаляет все имена пакетов и точки, поэтому результат должен быть ClassName.

Стратегия 3 удаляет все имена пакетов и точки, затем ставит подчеркивание перед каждой буквой в верхнем регистре и, наконец, преобразует в нижний регистр, что должно дать class_name.

(Исходный код hibernate 4.1.0.Final, похоже, не изменился в этих классах.)

Может ли кто-нибудь помочь мне прояснить это?


person weaselflink    schedule 08.08.2013    source источник


Ответы (1)


Очень просто! Поскольку я не хочу тратить время на создание игрушечной среды с помощью hibernate-core 3.6.6.Final, я даю вам инструкцию, как проверить, какой экземпляр используется ТОЧНО В ВАШЕМ РАБОЧЕМ ПРИЛОЖЕНИИ.

Установите visualvm на свой хост. Это позволяет создавать дамп кучи для локального приложения. Чтобы создать дамп кучи на удаленном сервере, запустите на сервере:

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

Откройте дамп в visualvm и запустите запрос OQL:

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

Это ВАША СТРАТЕГИЯ НАИМЕНОВАНИЯ. Вы можете использовать вкладку «Экземпляр» для навигации по иерархии ссылок, чтобы узнать, какие другие фактические типы hbm или jpa NamingStrategy используются.

Различные версии Hibernate имеют разные объявленные поля и типы. Если поля namingStrategyDelegator нет, попробуйте докопаться до экземпляра:

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

Если этого класса нет в вашей версии Hibernate, попробуйте прочитать документы и исходники и найти подходящий класс.

С зависимостью org.hibernate:hibernate-entitymanager:jar:4.3.11.Final у меня есть:

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

и он использует внутренне:

LegacyHbmNamingStrategyDelegate
LegacyJpaNamingStrategyDelegate

в зависимости от наличия аннотаций JPA. В любом случае эти экземпляры ссылаются на LegacyNamingStrategyDelegator (да, циклические ссылки!), которые имеют поле namingStrategy с экземпляром org.hibernate.cfg.EJB3NamingStrategy.

Это все! Я трачу 1 минуту, чтобы найти реализацию стратегии именования по умолчанию в моем wepapp и 5 минут, чтобы написать этот пост ((

Спасибо за просмотр, удачного взлома!

person gavenkoa    schedule 25.12.2015