我正在尝试使用hibernate功能来增强刷新性能而不需要更改代码。我遇到了选项 hibernate.ejb.use_class_enhancer 我做了以下更改。
1)启用属性hibernate.ejb.use_class_enhancer为true 构建失败并出现错误'如果未指定LoadTimeWeaver,则无法应用类转换器'
2)我补充说 context:load-time-weaver 到上下文文件 构建失败,出现以下错误: 指定自定义LoadTimeWeaver或使用Spring的代理启动Java虚拟机:-javaagent:spring-agent.jar
3)我将以下内容添加到maven-surefire-plugin中 的 javaagent:$ {settings.localRepository} /组织/ springframework的/弹簧 剂/ 2.5.6.SEC03 /弹簧剂2.5.6.SEC03.jar
现在构建成功。
我们有一个拦截器,用于跟踪事务中刷新的实体数量 在我做了上述更改之后,我预计这个数字会显着下降,但是,他们没有。
我的问题是:
修改
调试后,我发现了以下内容 有一段时间我们的DO类被提交进行转换,但是,确定给定类是否应该被转换的逻辑不能正确处理类名(在我的例子中),因此,DO类去了没有被改造。 有没有办法可以通过我的逻辑呢?
相关代码如下
对于以下输入,return copyEntities.contains( className );
出现错误
copyEntities包含字符串"com.x.y.abcDO", "com.x.y.asxDO"
的列表,其中className为"com.x.y.abcDO_$$_jvsteb8_48"
public InterceptFieldClassFileTransformer(List<String> entities) {
final List<String> copyEntities = new ArrayList<String>( entities.size() );
copyEntities.addAll( entities );
classTransformer = Environment.getBytecodeProvider().getTransformer(
//TODO change it to a static class to make it faster?
new ClassFilter() {
public boolean shouldInstrumentClass(String clas sName) {
return copyEntities.contains( className );
}
},
//TODO change it to a static class to make it faster?
new FieldFilter() {
@Override
public boolean shouldInstrumentField(String clas sName, String fieldName) {
return true;
}
@Override
public boolean shouldTransformFieldAccess(
String transformingClassName, String fieldOwnerClassName, String fieldName
) {
return true;
}
}
);
}
于6月15日编辑
我更新了我的项目,使用Spring 4.0.5.RELEASE和hibernate到4.3.5.Final
我开始使用org.hibernate.jpa.HibernatePersistenceProvider
和
org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver
和
hibernate.ejb.use_class_enhancer=true
通过这些更改,我正在调试刷新行为。我在这个代码块中有一个问题。
private boolean isUnequivocallyNonDirty(Object entity) {
if(entity instanceof SelfDirtinessTracker)
return ((SelfDirtinessTracker) entity).$$_hibernate_hasDirtyAttributes();
final CustomEntityDirtinessStrategy customEntityDirtinessStrategy =
persistenceContext.getSession().getFactory().getCustomEntityDirtinessStrategy();
if ( customEntityDirtinessStrategy.canDirtyCheck( entity, getPersister(), (Session) persistenceContext.getSession() ) ) {
return ! customEntityDirtinessStrategy.isDirty( entity, getPersister(), (Session) persistenceContext.getSession() );
}
if ( getPersister().hasMutableProperties() ) {
return false;
}
if ( getPersister().getInstrumentationMetadata().isInstrumented() ) {
// the entity must be instrumented (otherwise we cant check dirty flag) and the dirty flag is false
return ! getPersister().getInstrumentationMetadata().extractInterceptor( entity ).isDirty();
}
return false;
}
在我的情况下,由于persister saying yes for hasMutableProperties
,流程返回false。我认为拦截器根本没有机会回答
是不是字节码转换器在这里导致拦截器?或者字节码转换应该使实体成为SelfDirtinessTracker
?
任何人都可以解释一下,我在这里应该从字节码转换中得到什么样的行为。