问题标签 [byte-code-enhancement]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3510 浏览

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

我使用的是 Hibernate 4.3.6,并使用了最新的Maven 字节码增强功能来检测所有实体的自我肮脏意识。

我添加了 Maven 插件:

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

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

并且$$_hibernate_hasDirtyAttributes()总是返回false

这是因为$$_hibernate_attributeInterceptor始终为空,所以在设置任何属性时:

因为$$_hibernate_getInterceptor()为 null,trackChange 将被绕过,因此字节码增强不会解决脏属性,并且将使用默认的深度比较算法。

我错过了什么?如何$$_hibernate_attributeInterceptor正确设置,以便字节码检测方法跟踪脏属性?

0 投票
1 回答
475 浏览

java - 休眠验证和字节码增强

任何人都可以帮助我理解 Hibernate Validation 参考文档中本节的含义。

验证字节码增强对象时应使用属性级别约束,因为字节码增强库无法通过反射确定字段访问。[ 1 ]

0 投票
1 回答
7735 浏览

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

环境

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

问题

我认为 gradle 会将所有文件(资源和类)临时放在同一个文件夹中,然后从该文件夹创建一个 jar。但似乎 gradle 在组装 jar 之前有两个不同的位置用于资源和类文件。如前所述,用于代码检测的第三方工具需要与类文件相同的文件夹结构中的描述文件。

问题

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

想法

  1. 将描述文件放在src/main/java. 不是很“干净”,但可能是一个解决方案。可悲的是 gradle 忽略了这些文件。我试图以某种方式包含它们,但还没有让它工作。
  2. 暂时将描述文件复制到正确的位置。也不是一个非常“干净”的方式
0 投票
3 回答
1789 浏览

java - Hibernate:脏场跟踪

我现在有点困惑。我会尽量简单地解释我的担忧:

我有一个 Spring Boot 应用程序,当然,它有实体。这些实体通过百里香叶形式更新。在这种形式中,只有一些相关字段是可更改的。例如name实体的。其他字段,如createdcreatedbylastUsedBy不受此表单控制/更改。

现在问题来了:如果我们现在更改实体,所有其他字段都设置为null,因为它们不在请求中。一种方法是为这些缺失的字段添加<input type="hidden"/>输入。但这不是很优雅且容易出错。比我得出的结论,休眠应该只更新那些已更改的字段。所以这必须通过 DirtyTracking 来完成。我目前有另一个应用程序,它使用 OpenJPA 和 openJPA 增强器,在这个应用程序中,更新只更新更改的字段。我的假设是 Hibernate 增强器可以解决我的问题。但是即使启用了脏跟踪,所有字段都会更新并且信息会丢失。当我将注释添加到给定实体时,我已经设法让它工作@DynamicUpdate,但这不是正确的方法吗?

我仔细检查了实体是否得到了增强,还调试了 spring/hibernate 的整个保存过程。我在这里错过了什么吗?为什么休眠还会更新所有非脏字段?

编辑

我已经进一步检查并到达这一点:代码来自 AbstractEntityTuplizer

values 对象数组只有几个预填充的值,只有更改/脏的值。例如values[5]values[6]。但是所有的设置器都会被调用,并且null如果它们没有在函数的值参数中,值就会被设置为。对我来说看起来像一个错误。

0 投票
1 回答
207 浏览

java - 字节码增强后无法在eclipse中调试

我们有一个非常古老的 java 项目,它由一些子项目组成,其中一个使用了字节码增强器 jdodoclet,整个东西都是由 ant 脚本构建的。

现在,每当尝试对项目进行调试时,一旦我们进入该特定项目的类,我们就不能只进入,但不能跳过,使调试变得毫无意义。

所以当调试第一次开始时,eclipse会给我们一个警告 警告java断点

但它继续正常。

一旦我们进入程序的任何类,eclipse就无法显示我们在源代码中的位置,也无法显示行号(好吧,行号是原因)

没有行号

我确实检查并仔细检查了编译器设置

在此处输入图像描述

并重新启动日食。

但它仍然不起作用。

有人对这个问题有什么建议吗?

0 投票
2 回答
2499 浏览

hibernate - SpringBoot hibernate gradle 字节码增强

我正在尝试使 OneToOne 关系懒惰地休眠。

我的设置是使用休眠和 Gradle 的 spring-data-jpa。

即使这是一个有据可查的问题/功能,并且有很多很好的读物,我已经意识到他们中的大多数都在处理 maven。

幸运的是,有一个 Gradle 插件可以用于这个特定的原因,即使文档不是最好的,我发现这篇文章也处理了同样的问题,这似乎是一个非常简单的解决方案。

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

./gradlew 构建

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

由于未启用任何功能,因此跳过 Hibernate 字节码增强

根据插件的源代码,未启用增强功能时会显示此消息,而我使用的情况并非如此:

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

我的 gradle 文件看起来像:

0 投票
0 回答
283 浏览

java - 无法通过字节码增强在 Hibernate 中获取 LazyToOne 实体

我最近通过 hibernate-enhance-maven-plugin 在我的 Hibernate 项目中引入了字节码增强。我真的需要能够延迟初始化某些字段以解决代表文档的实体中@Lob 字段的性能问题,并且延迟初始化整个实体不是一种选择。

但是,我发现在引入字节码增强后,我的其他 Lazy @ManyToOne 字段都无法获取。我执行包含 fetch 的查询,但在结果返回中所需的实体为 null。我知道该字段在数据库中不为空,如果我删除 hibernate-enhance-maven-plugin 并重新编译 fetch 按预期工作。

下面是我要检索的主要实体 (Office) 和我要获取的惰性 ManyToOne 实体 (Document)。

我设置了我的标准并尝试使用 JPQL 从数据库中提取。

如果我有字节码增强,这给了我我的办公室,但没有文档,如果我没有字节码增强,它给我我的办公室和我的文档。

我不知所措。从我在文档中可以阅读的内容来看,我应该正确设置它。我错过了一些东西,但我真的不知道它是什么。我曾尝试使用 CriteriaBuilder 作为测试,而只是看看它是否有所作为,但结果是相同的:

更令人困惑的是,生成的 SQL 似乎是准确的。当我进行提取时,Hibernate 显示以下内容:

直接对我的数据库运行它给了我我正在寻找的纯原始术语

目前,我使用的是 Hibernate 5.4.2.Final,如您所见,它包括 Envers。

0 投票
1 回答
333 浏览

java - 获取惰性 OneToOne 实体会获取同一对象中的所有其他 OneToOne 实体

使用Entity entity = hibernateTemplate.get(Entity.class, id);当我点击一个entity.getChild()OneToOne 关系时,也会加载所有其他 OneToOne 关系。我使用休眠 5.4.1-Final。

我使用字节码增强如下:

爪哇

B.java

C.java

所以当我这样做的时候

即使我B在一个中获取HQLQuery,我仍然有一个查询C

我尝试进行双重映射(指定了 mappedBy 的 OneToOne)但没有成功。B和C的PK与A相同。

我希望a.getB();不会触发 C 的获取。这是一个休眠错误吗?我在他们的文档中找不到任何关于这种行为的信息。

我的映射正确吗?

0 投票
1 回答
564 浏览

java - Hibernate 字节码增强单向多对一

我正在尝试将字节码增强添加到基于 Java 的 Hibernate 应用程序中。Hibernate 是 5.2.6.Final 版本,它内置在 maven 中,所以我使用的是hibernate-enhance-maven-plugin。我已经测试了以下问题直到 5.2.18.Final,但结果是一样的。

“enableAssociationManagement”选项给我带来了几个问题,应用程序无法增强。我的问题是我有几个单向多对一映射,我只需要从子类访问父类。我永远不需要引用来自父实体的子实体。

我拥有的典型映射如下所示:

所有这些映射在增强过程中都失败了,给我以下错误:

我理解错误。我在父级中没有相应的 @OneToMany 注释。我已经确认这确实有效:

但如前所述,我不想要一个。我目前的理解是,只有一个单向的@ManyToOne 映射(只是@ManyToOne)更有效。但是,也许我错了,因为这个错误即将出现?

有没有更好的方法来注释我的两个模型实体?或者是否有我缺少的注释/选项将向字节码增强表明多对一关系完全是单向的,而不是双向的?

0 投票
0 回答
1174 浏览

java - hibernate-enhance-maven-plugin:java.lang.IllegalStateException:方法上的意外类型引用:19

我最近通过在我的 pom.xml 中添加以下行来添加本文所述的字节码增强功能:

当我尝试运行时mvn clean install,出现以下错误:

从异常中我猜它与 Lombok 生成的 Builder 有关。IllegalStateException: Unexpected type reference on method: 19不幸的是,我在互联网上找不到任何有关的信息。这是 maven 失败的类: