2016-01-11 6 views
1

При использовании равнину Hibernate это можно сделать следующим образом:Как зарегистрировать собственный идентификатор генератора в Hibernate JPA EntityManager?

public class MyLocalSessionFactoryBean extends LocalSessionFactoryBean { 

    // can also be made configurable e.g. with Springs EL... 
    private Class myIdentifierGeneratorClass = MyIdentifierGeneratorClass.class; 

    @Override 
    protected SessionFactory buildSessionFactory(LocalSessionFactoryBuilder sfb) { 

     Configuration config = getConfiguration(); 
     MutableIdentifierGeneratorFactory identifierGeneratorFactory = config.getIdentifierGeneratorFactory(); 
     identifierGeneratorFactory.register("xyz", myIdentifierGeneratorClass); 

     return super.buildSessionFactory(sfb); 
    } 
} 

Теперь можно написать, например,

@MappedSuperclass 
public class BaseEntity implements Serializable { 

    @Id 
    @GeneratedValue(generator = "generatorName") 
    @GenericGenerator(name = "generatorName", strategy = "xyz") 
    private Long id; 
} 

Как это можно достичь при использовании Hibernate JPA EntityManager?

Возможно, используя LocalContainerEntityManagerFactoryBean#postProcessEntityManagerFactory(EntityManagerFactory emf, PersistenceUnitInfo pui)?

Я также нашел EntityManagerFactoryBuilderImpl#buildHibernateConfiguration(ServiceRegistry serviceRegistry), но я не знаю, где «подключиться» (я использую Spring и/или Spring-Boot и Spring-Data).

Заранее благодарен!

+0

Не является ли стратегия = "xyz" предполагаемой стратегией = "com.mycompany.myIdentifierGeneratorClass"? Стратегия –

+0

должна быть «... либо предопределенной стратегией Hibernate, либо полностью квалифицированным именем класса», см., Например, http://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/annotations/GenericGenerator.html – bgraves

+0

В первом блоке кода вы идентифицируете класс MyIdentifierGeneratorClass.class; это ваш класс, который вы хотите использовать с аннотациями JPA (@GenericGenerator (name = "", strategy = "MyIdentifierGeneratorClass"? –

ответ

2

Вам необходимо указать свойство конфигурации hibernate.ejb.identifier_generator_strategy_provider, которое определяет полное имя вашего IdentifierGeneratorStrategyProvider.

Этот IdentifierGeneratorStrategyProvider интерфейс определяет следующий метод:

public Map<String,Class<?>> getStrategies(); 

, которые вам нужно реализовать и определить свою собственную стратегию там.

Во время начальной загрузки EntityManager будет настроен так:

final Object idGeneratorStrategyProviderSetting = configurationValues.remove(AvailableSettings.IDENTIFIER_GENERATOR_STRATEGY_PROVIDER); 
if (idGeneratorStrategyProviderSetting != null) { 
    final IdentifierGeneratorStrategyProvider idGeneratorStrategyProvider = 
      strategySelector.resolveStrategy(IdentifierGeneratorStrategyProvider.class, idGeneratorStrategyProviderSetting); 
    final MutableIdentifierGeneratorFactory identifierGeneratorFactory = ssr.getService(MutableIdentifierGeneratorFactory.class); 
    if (identifierGeneratorFactory == null) { 
     throw persistenceException(
       "Application requested custom identifier generator strategies, " + 
         "but the MutableIdentifierGeneratorFactory could not be found" 
     ); 
    } 
    for (Map.Entry<String,Class<?>> entry : idGeneratorStrategyProvider.getStrategies().entrySet()) { 
     identifierGeneratorFactory.register(entry.getKey(), entry.getValue()); 
    } 
} 

так, стратегия вы определяете будет настроен в MutableIdentifierGeneratorFactory так же, как вы делали ранее.

+0

Привет, Влад, я надеялся на вашу помощь! ;-) 1. Фрагмент кода выглядит как из ветки 5.0.x. 2. Поскольку я на самом деле использую Spring-Boot, я в версии 4.3.11. 3. В 4.3.11 код выглядит несколько иначе, но если я снова посмотрю на него (после прочтения вашего полезного сообщения), я откажусь от него и это выглядит многообещающе! Попробуйте как можно скорее! Благодаря! – bgraves

+0

Добро пожаловать. Надеюсь, поможет. –

+0

Да, это работает - еще раз спасибо! :-) – bgraves