gpt4 book ai didi

hibernate - 如何使用 JPA EntityManager 注册自定义 Hibernate IdentifierGenerator?

转载 作者:行者123 更新时间:2023-12-02 21:08:42 34 4
gpt4 key购买 nike

当使用普通 Hibernate 时,可以通过以下方式完成:

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) 但我不知道在哪里“ Hook ”(我正在使用 Spring 和/或 Spring-Boot 和 Spring-Data )。

提前致谢!

最佳答案

您需要提供一个 hibernate.ejb.identifier_generator_strategy_provider 配置属性,它定义您的 IdentifierGeneratorStrategyProvider 实现的完全限定名称。

IdentifierGeneratorStrategyProvider接口(interface)定义了以下方法:

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 中进行配置,就像您之前所做的那样。

关于hibernate - 如何使用 JPA EntityManager 注册自定义 Hibernate IdentifierGenerator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34731783/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com