2016-01-11 131 views
1

當使用普通休眠這可以通過以下方式進行:如何在Hibernate JPA EntityManager中註冊自定義IdentifierGenerator?

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

是不是strategy =「xyz」應該是strategy =「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

Hi Vlad,希望對您有所幫助!--) 1.代碼段來自5.0.x分支 2.由於我實際上使用Spring-Boot,因此我使用4.3.11版本 3.在4.3.11代碼看起來有點不同,但如果我再看一遍(在閱讀有用的文章之後) rstand,它看起來很有前途! 將盡快嘗試!謝謝! – bgraves

+0

不客氣。希望能幫助到你。 –

+0

是的,它的工作原理 - 再次感謝! :-) – bgraves