hibernate @Basic(fetch = FetchType.LAZY)不立即获取带有@EntityGraph的@Lob

vecaoik1  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(141)
Entity
@Table(name = "batch")
@NamedEntityGraph(name = "withLobs", attributeNodes = {
        @NamedAttributeNode(value = "log"),
        @NamedAttributeNode(value = "json"),
})
public class Batch extends PanacheEntityBase
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "HIBERNATE_SEQUENCE")
    @GenericGenerator(name = "HIBERNATE_SEQUENCE", strategy = "native")
    public long id;
        // other properties
    @Basic(fetch = FetchType.LAZY)
    @Lob
    public byte[] json;
    @Basic(fetch = FetchType.LAZY)
    @Lob
    @Column(name = "`log`")
    public byte[] log;
}

does按预期工作(json和log是用lazy加载的,带有额外的查询)。
应用实体图:

final List<Batch> b = Batch.findAll(Sort.descending("creationDate"))
  withHint(QueryHints.HINT_FETCHGRAPH, Panache.getEntityManager().getEntityGraph("withLobs"))
page(Page.of(pagination.page - 1, pagination.limit)).list();

json和log不包含在main select中,并且始终使用+1 select读取。
我尝试将quarkus.hibernate-orm.unsupported-properties."hibernate.bytecode.allow_enhancement_as_proxy"=true添加到application.properties中,作为

<plugin>
  <groupId>org.hibernate.orm.tooling</groupId>
  <artifactId>hibernate-enhance-maven-plugin</artifactId>
  <executions>
    <execution>
      <configuration>
        <failOnError>true</failOnError>
        <enableLazyInitialization>true</enableLazyInitialization>
      </configuration>
      <goals>
        <goal>enhance</goal>
      </goals>
    </execution>
  </executions>
</plugin>

在pom.xml中,但没有成功(但我很确定字节码增强已经在Quarkus中活跃)。
有什么建议吗?

vngu2lb8

vngu2lb81#

使用Quarkus时,您不需要quarkus.hibernate-orm.unsupported-properties."hibernate.bytecode.allow_enhancement_as_proxy"=truehibernate-enhance-maven-plugin。Quarkus会自动完成增强。所以这不是问题所在。
根据您使用的版本,它可能只是一个bug。Hibernate ORM 5中的实体图支持......不完整。Hibernate ORM 6彻底检查了这部分代码,并且在实体图方面更加可靠。请再次尝试Quarkus 3.0.0.Beta1(使用Hibernate ORM 6.2.0.CR4),如果仍然不起作用,您应该报告一个bug:https://hibernate.atlassian.net/browse/HHH

相关问题