序列生成器的Hibernate cfg.xml配置
各位发展商:, 我发现很难配置序列生成 我继承了一个具有以下id字段定义的持久类:序列生成器的Hibernate cfg.xml配置,hibernate,hibernate-mapping,sequence-generators,Hibernate,Hibernate Mapping,Sequence Generators,各位发展商:, 我发现很难配置序列生成 我继承了一个具有以下id字段定义的持久类: @Id @GeneratedValue(strategy= GenerationType.AUTO) private Long id; 我所有的类都继承自这个类 我想要的主要东西是: 我需要重写id生成策略以使用HiLo。它必须在cfg.xml中,因为它是我唯一可以控制的地方。 这件事看起来很有希望: <property name="hibernate.id.new_generator_mappings"
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
我所有的类都继承自这个类
我想要的主要东西是:
我需要重写id生成策略以使用HiLo。它必须在cfg.xml中,因为它是我唯一可以控制的地方。
这件事看起来很有希望:
<property name="hibernate.id.new_generator_mappings">true</property>
true
但是,我无法选择优化或增量大小(我想选择HiLo)
50
希洛
没用,也没用
<property name="increment_size">50</property>
<property name="optimizer">hilo</property>
50
希洛
也不是
org.hibernate.id.enhanced.HiLoOptimizer
总是选择NoopTimizer
任何提示都会有帮助。提前非常感谢。让我们做一些调查(查看Hibernate源代码): 定义自动映射的方式:
switch ( generatorEnum ) {
// ...
case AUTO:
return useNewGeneratorMappings ?
org.hibernate.id.enhanced.SequenceStyleGenerator.class.getName() : "native";
// ...
如果不使用NewGeneratorMappings,您就只能使用本机实现。Hibernate将根据数据库解决这个问题(请参阅,以了解特定数据库的解决方案)
但由于您使用了NewGeneratorMappings,我们必须查看:
假设传递了正确的属性,并且其中有一个“optimizer”属性,那么应该返回您的值。此值用于调用(作为第一个参数):
公共静态优化器buildOptimizer(字符串类型、类returnClass、int incrementSize){
最后一节课到目前为止还没有办法做到这一点。
但我也找不到一个方法来做这个新的
hibernate.id.new_generator_mappings = true
这一个将使用新的SequenceStyleGenerator,但我无法配置它。用于配置的参数(如“optimizer”和“increment_size”)不会传递给配置生成器的方法
我的观点是,我不知道如何使用“hibernate.id.new_生成器_映射”来使用hilo优化器并正确配置,我的反向工程能力被证明是不可靠的
为了使用hilo,我必须做这个@GeneratedValue(strategy=SEQUENCE),它可以用于测试,但对我来说不是一个好的选择
谢谢@xwoker,但我无法完成它。您是否有一些额外的applicationContext.xml文件,可能会覆盖cfg.xml中的设置?另请参阅?您是否为hibernate启用了调试级别日志记录,它是否说明了您正在使用的属性?我没有这样的文件。我想我正在使用的属性可能没有选择正确的。我将检查使用的属性是否正确。当我尝试调试此代码时,它表明在没有生成器的情况下使用Auto方法实际上不会完全按照我的预期完成此代码。用于构建优化器的属性仅受到限制,因为“没有生成器”(在@ID的注释中)。我记不清代码部分了,但我会让它再检查一次getProperties。您是否知道,在哪里可以找到hibernate.cfg.xml的所有配置属性的综合列表?顺便说一句,谢谢。不,不是一个综合列表。hibernate文档没有那么完整…这就是我为什么要这么做的原因查看相关代码正在查看哪些属性,并查看实际使用的属性是否真的是来自cfg的属性。xmlI进行了大量调试,遗憾的是,以下内容无法正常工作://OPT_PARAM=“optimizer”return ConfigurationHelper.getString(OPT_PARAM,params,defaultOptimizerStrategy);因为参数在属性中没有OPT_PARAM,即使它位于SessionFactoryImpl.getProperties()中。在方法中传递的参数是动态生成的,并且它没有会话工厂中的所有属性。另一件事是SessionFactoryImpl.getProparties()返回所有未由hibernate定义的属性。因此打印没有帮助
switch ( generatorEnum ) {
// ...
case AUTO:
return useNewGeneratorMappings ?
org.hibernate.id.enhanced.SequenceStyleGenerator.class.getName() : "native";
// ...
protected String determineOptimizationStrategy(Properties params, int incrementSize) {
// ... some stuff to calculate defaultOptimizerStrategy
// OPT_PARAM = "optimizer"
return ConfigurationHelper.getString( OPT_PARAM, params, defaultOptimizerStrategy);
}
public static Optimizer buildOptimizer(String type, Class returnClass, int incrementSize) {
final Class<? extends Optimizer> optimizerClass;
final StandardOptimizerDescriptor standardDescriptor =
StandardOptimizerDescriptor.fromExternalName( type ); // HILO("hilo", HiLoOptimizer.class),
if ( standardDescriptor != null ) {
optimizerClass = standardDescriptor.getOptimizerClass();
}
else {
try {
optimizerClass = ReflectHelper.classForName( type );
}
catch( Throwable ignore ) {
LOG.unableToLocateCustomOptimizerClass( type );
return buildFallbackOptimizer( returnClass, incrementSize );
}
}
try {
final Constructor ctor = optimizerClass.getConstructor( CTOR_SIG );
return (Optimizer) ctor.newInstance( returnClass, incrementSize );
}
catch( Throwable ignore ) {
LOG.unableToInstantiateOptimizer( type );
}
return buildFallbackOptimizer( returnClass, incrementSize );
}
private static Optimizer buildFallbackOptimizer(Class returnClass, int incrementSize) {
return new NoopOptimizer( returnClass, incrementSize );
}
hibernate.id.new_generator_mappings = true