You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot3/JPA+Hibernate6中EntityManager.find致应用卡顿求助

问题:Spring Boot 3 + Hibernate 6下EntityManager.find卡顿及测试输出乱码

现象

  • 在Spring Boot 3、Jakarta JPA、Hibernate 6环境中,执行EntityManager.find操作时应用出现卡顿,单元测试输出乱码
  • 移除实体中的抽象集合字段后,问题消失;但在Spring Boot 2.X+Hibernate 5环境下无此异常

相关代码

实体类

抽象父类TestAbstract

@Entity
@DiscriminatorColumn(name = "_MODELTYPE")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class TestAbstract {
  // [... 其他变量、id等定义]
  /** multiple abstracts. */
  @OneToMany(mappedBy = "deepListAnchor", cascade = {})
  private Collection<TestDeepAbstract> someList;
  // 更多字段...
}

抽象关联类TestDeepAbstract

@Entity
@DiscriminatorColumn(name = "_MODELTYPE")
public abstract class TestDeepAbstract {
  // ...
  @ManyToOne
  private TestAbstract deepListAnchor;
  // ...
}

persistence.xml配置

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
  http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
    version="2.1">
    <persistence-unit name="system"
        transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
                <!-- 所有实体类声明等内容 -->
    </persistence-unit>
</persistence>

测试代码

CriteriaBuilder cb = emf.getCriteriaBuilder();

CriteriaQuery<Tuple> query = cb.createTupleQuery();
Root<TestCustomerPerson> root = query.from(TestCustomerPerson.class);
List<Selection<?>> selectFields = new ArrayList<Selection<?>>();
selectFields.add(root.get("id").alias("id"));
query.multiselect(selectFields);

List<Predicate> exps = new ArrayList<Predicate>();
exps.add(cb.equal(root.get("firstname"), "hans"));
exps.add(cb.equal(root.get("lastname"), "meister"));
Predicate andClaus = cb.and(exps.toArray(new Predicate[0]));


List<Predicate> exps1 = new ArrayList<Predicate>();
exps1.add(cb.equal(root.get("firstname"), "bob"));
exps1.add(cb.equal(root.get("lastname"), "burger"));
Predicate andClaus1 = cb.and(exps1.toArray(new Predicate[0]));


List<Predicate> ober = new ArrayList<Predicate>();
ober.add(andClaus);
ober.add(andClaus1);
Predicate orClaus = cb.or(ober.toArray(new Predicate[0]));

query.where(orClaus);

try (EntityManager em = emf.createEntityManager()) {
  TypedQuery<Tuple> listQueryWithoutPagination = em.createQuery(query);

  List<Tuple> tupleResult = listQueryWithoutPagination.getResultList();
  assertEquals(2, tupleResult.size());
  
  TestCustomerPerson tcp = em.find(TestCustomerPerson.class, "1");
  assertNotNull(tcp);
}

排查结论

已搭建测试仓库,怀疑该问题是Hibernate 6的Bug导致。

内容的提问来源于stack exchange,提问作者Daniel Mertins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 05:03:26