研究员, 我发现很难配置序列生成。
我继承了一个具有以下id字段定义的持久化类:
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
我的所有类都继承自此类。
我想要的主要内容: 我需要覆盖id生成策略才能使用HiLo。它必须在cfg.xml中,因为它是我唯一可以控制的地方。
这件事看起来很有希望:
<property name="hibernate.id.new_generator_mappings">true</property>
但是我无法选择优化或增量大小(我想去HiLo)
<property name="hibernate.id.increment_size">50</property>
<property name="hibernate.id.optimizer">hilo</property>
不起作用,也
<property name="increment_size">50</property>
<property name="optimizer">hilo</property>
,也不
<property name="optimizer">org.hibernate.id.enhanced.HiLoOptimizer</property>
总是选择NoopOptimizer。
任何提示都会有所帮助。非常感谢。
答案 0 :(得分:2)
让我们做一些调查(看一下Hibernate的来源):
AnnotationBinder
定义了AUTO的映射方式:
switch ( generatorEnum ) {
// ...
case AUTO:
return useNewGeneratorMappings ?
org.hibernate.id.enhanced.SequenceStyleGenerator.class.getName() : "native";
// ...
如果您不使用NewGeneratorMappings,那么您将无法使用本机实现。 Hibernate将根据数据库解决这个问题(请参阅this answer以查看特定数据库的内容)。
但是既然您使用了NewGeneratorMappings,我们必须查看SequenceStyleGenerator
:
protected String determineOptimizationStrategy(Properties params, int incrementSize) {
// ... some stuff to calculate defaultOptimizerStrategy
// OPT_PARAM = "optimizer"
return ConfigurationHelper.getString( OPT_PARAM, params, defaultOptimizerStrategy);
}
假设传递了正确的属性并且您有一个“optimizer”属性,那么应该返回您的值。该值用于调用OptimizerFactory.buildOptimizer
(作为第一个参数):
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 );
}
因此要么找到你的值“hilo”(或你的“HiLoOptimizer”),要实例化它并返回它,否则它会记录一些错误信息。如果您在日志中找不到任何错误消息,我会check whether the properties in the cfg.xml are actually really used。尝试使用getProperties()
实例上的org.hibernate.internal.SessionFactoryImpl
访问它们。
答案 1 :(得分:0)
到目前为止,没有办法做到这一点。 但我也找不到用新的
做到这一点的方法hibernate.id.new_generator_mappings = true
这个将使用新的SequenceStyleGenerator但我无法配置它。用于配置的参数(例如“optimizer”和“increment_size”)不会传递给配置生成器的方法。
我的观点是,我不知道这个“hibernate.id.new_generator_mappings”应该如何用于使用hilo优化器并正确配置,我的逆向工程能力被证明是不可靠的。
要使用hilo我必须这样做@GeneratedValue(策略= SEQUENCE),它可以用于测试,但对我来说这不是一个好选择。
感谢@xwoker,但我无法完成它。