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
相关产品推荐
相关产品推荐

