标签: byte-code-enhancement

Hibernate 4字节码增强功能不适用于脏检查优化

我正在使用Hibernate 4.3.6,我利用最新的Maven字节码增强功能来检测所有实体的自我肮脏意识.

我添加了maven插件:

<build>
    <plugins>
        <plugin>
            <groupId>org.hibernate.orm.tooling</groupId>
            <artifactId>hibernate-enhance-maven-plugin</artifactId>
            <executions>
                <execution>
                    <phase>process-test-resources</phase>
                    <goals>
                        <goal>enhance</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)

我看到我的实体正在增强:

@Entity
public class EnhancedOrderLine
implements ManagedEntity, PersistentAttributeInterceptable, SelfDirtinessTracker
{
    @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  private Long id;
  private Long number;
  private String orderedBy;
  private Date orderedOn;

  @Transient
  private transient PersistentAttributeInterceptor $$_hibernate_attributeInterceptor;

  @Transient
  private transient Set $$_hibernate_tracker;

  @Transient
  private transient CollectionTracker $$_hibernate_collectionTracker;

  @Transient
  private transient EntityEntry $$_hibernate_entityEntryHolder;

  @Transient
  private transient ManagedEntity $$_hibernate_previousManagedEntity;

  @Transient
  private transient ManagedEntity $$_hibernate_nextManagedEntity;

  ...
Run Code Online (Sandbox Code Playgroud)

在调试时,我正在检查org.hibernate.event.internal.DefaultFlushEntityEventListener#dirtyCheck方法:

        if …
Run Code Online (Sandbox Code Playgroud)

java orm hibernate byte-code-enhancement dirty-checking

33
推荐指数
1
解决办法
2744
查看次数

SpringBoot hibernate gradle字节码增强

我正在试图勉强地将hibernate OneToOne关系工作.

我的设置是使用hibernate和Gradle的spring-data-jpa.

即使这是一个记录良好的问题/功能,并且有很多好的读取,我已经意识到他们中的大多数正在处理maven.

幸运的是,有一个Gradle插件可以用于这个特殊的原因,即使文档不是最好的,我发现这个帖子也处理相同的问题,它似乎是一个非常简单的解决方案.

在我实现了Gradle脚本中所需的更改之后,似乎hibernate仍然急切地加载了OneToOne关系,所以我尝试执行

./gradlew build

并注意到打印了以下消息:

跳过Hibernate字节码增强,因为没有启用任何功能

根据插件源代码,当未启用增强功能时会显示此消息,而不是我正在使用的情况:

hibernate {
enhance {
    enableLazyInitialization= true
    enableDirtyTracking = true
    enableAssociationManagement = true
    enableExtendedEnhancement = true
}}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是有人让这个工作正常吗?如果是的话,请您指点一些教程/指南以实现它吗?我在集成测试中使用拦截器来验证hibernate正在使用的查询数以及监视sql日志.

我的gradle文件看起来像:

buildscript {
repositories { mavenCentral() }
dependencies {
   classpath 'com.github.ben-manes:gradle-versions-plugin:+'
}
dependencies {
    classpath "org.hibernate:hibernate-gradle-plugin:5.2.15.Final"
 }
}

plugins {
 id "io.spring.dependency-management" version "1.0.3.RELEASE"
}

ext { springBootVersion = '1.5.4.RELEASE' }
ext['flyway.version'] = '4.0.3'

apply plugin: 'java'
apply plugin: 'checkstyle'
apply plugin: 'findbugs'
apply …
Run Code Online (Sandbox Code Playgroud)

hibernate gradle spring-data-jpa spring-boot byte-code-enhancement

9
推荐指数
1
解决办法
1091
查看次数

是否值得使用 Hibernate Bytecode Enhancement 机制?

我目前正在阅读 Vlad Mihalcea 的书High-Performance Java Persistence

在字节码增强部分,据说enableDirtyTracking可以通过替换反射来优化大量数据的性能。但我只是想知道是否有任何缺点?

不幸的是,我找不到任何或只有非常旧的信息。

<plugin>
   <groupId>org.hibernate.orm.tooling</groupId>
   <artifactId>hibernate-enhance-maven-plugin</artifactId>
   <version>${hibernate.version}</version>
   <executions>
      <execution>
         <configuration>
            <failOnError>true</failOnError>
            <enableDirtyTracking>true</enableDirtyTracking>
            <enableLazyInitialization>false</enableLazyInitialization>
            <enableAssociationManagement>false</enableAssociationManagement>
            <enableExtendedEnhancement>false</enableExtendedEnhancement>
         </configuration>
         <goals>
            <goal>enhance</goal>
         </goals>
      </execution>
   </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

在进一步研究 Hibernate 文档时,我发现了另外三个属性:

  • enableLazyInitialization,
  • enableAssociationManagement,
  • enableExtendedEnhancement.

但我在互联网上找不到太多关于它的信息。

如果我理解正确,是否enableAssociationManagement使双向关系的独立处理变得多余并替换enableLazyInitializationenableDirtyTracking反射?

不幸的是,我找不到任何关于enableExtendedEnhancement. 这就是为什么我有与上述相同的问题。我应该只使用它吗?或者由此产生哪些缺点?

java orm hibernate lazy-loading byte-code-enhancement

8
推荐指数
1
解决办法
2968
查看次数

如何使用gradle复制classes文件夹中的资源文件?

环境

我正在使用需要字节码检测的第三方库.执行字节码检测的工具需要一些描述文件,这些文件必须与编译的.class文件位于相同的文件夹结构中.这些文件只在编译时才需要.

问题

我以为gradle会将所有文件(资源和类)暂时放在同一个文件夹中,然后从该文件夹创建一个jar.但是在组装jar之前,gradle似乎有两个不同的资源和类文件位置.就像之前提到的第三方代码检测工具一样,需要在类文件结构中使用相同文件夹结构中的描述文件.

简单地说:我该如何解决这个问题?

思路

  1. 将描述文件放在中src/main/java.不是很"干净",但可能是一个解决方案.遗憾的是,gradle会忽略这些文件.我试图以某种方式包括它们,但还没有让它工作.
  2. 暂时将描述文件复制到正确的位置.也不是一个非常"干净"的方式

java bytecode-manipulation gradle byte-code-enhancement

5
推荐指数
1
解决办法
4965
查看次数