Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate返回一个不为null的对象,但它本身却异常懒惰:JavassistLazInitializer_Java_Spring_Hibernate_Hibernate Entitymanager_Criteriaquery - Fatal编程技术网

Hibernate返回一个不为null的对象,但它本身却异常懒惰:JavassistLazInitializer

Hibernate返回一个不为null的对象,但它本身却异常懒惰:JavassistLazInitializer,java,spring,hibernate,hibernate-entitymanager,criteriaquery,Java,Spring,Hibernate,Hibernate Entitymanager,Criteriaquery,问题并不总是可再现的,而是当使用CriteriaBuilder从数据库获取对象时 代码: @Entity @Table(name = MyEntityObject.TABLE_NAME) @Access(AccessType.FIELD) @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) @BatchSize(size = 50) public class MyEntityObject extends AbstractCodeEntity i

问题并不总是可再现的,而是当使用CriteriaBuilder从数据库获取对象时

代码:

@Entity
@Table(name = MyEntityObject.TABLE_NAME)
@Access(AccessType.FIELD)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@BatchSize(size = 50)
public class MyEntityObject extends AbstractCodeEntity implements Comparable<MyEntityObject> {
@实体
@表(名称=MyEntityObject.Table\u名称)
@访问权限(AccessType.FIELD)
@缓存(用法=CacheConcurrencyStrategy.READ\u WRITE)
@批量大小(大小=50)
公共类MyEntityObject扩展了AbstractCodeEntity{
CriteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery CriteriaQuery=builder.createQuery(MyEntityObject.class);
Root=criteriaQuery.from(MyEntityObject.class);
谓词条件=builder.equal(root.get(MyEntityObject.code),code);
boolean distinct=FetchBuilder.buildFetchs(根,fetchsOperations);
criteriaQuery.distinct(distinct).where(条件);
TypedQuery=entityManager.createQuery(criteriaQuery);
返回query.getSingleResult();
当然,MyEntityObject的属性是懒惰的,而其他属性是急切的

调试时,返回的对象包含一个处理程序={JavassistLazyInitializer@19574}+为空的对象属性

我试图找出hibernate是否在数据库中查找它=>他找到了

然后,如果对象存在于第一个cach=>上,则它不存在


有人有想法吗?

我这边的两个注意事项-不确定这是否完全涵盖了您的问题:

  • 看看这些解决方案是否适用于您的案例
  • 序列化实体的目的是什么?也许可以找到一种方法将相关值复制到另一个对象中,而不序列化实体

我不确定问题是什么,当获取与
FetchType.LAZY
有关系的实体时,这种行为是完全正常的。你知道Hibernate/JPA懒惰和急切的获取/加载以及它的作用吗?请看:@OHGODSPIDERS是的,我知道,但这里我想要获取其ef的对象看起来很懒,我真的不知道理解这种行为。(我在上面添加了代码)哦,那么您选择的整个root
MyEntityObject
将作为Hibernate Lazy Load代理对象而不是实际对象返回?如果是这种情况,我也无法解释这种行为。您是否尝试过在没有CacheConcurrency策略的情况下使用它。READ\u WRITE?@Thomas它不太容易复制。您能解释一下它是如何实现的吗影响
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<MyEntityObject> criteriaQuery = builder.createQuery(MyEntityObject.class);

Root<MyEntityObject> root = criteriaQuery.from(MyEntityObject.class);

Predicate condition = builder.equal(root.get(MyEntityObject.code), code);
boolean distinct = FetchBuilder.buildFetchs(root, fetchsOperations);
criteriaQuery.distinct(distinct).where(condition);

TypedQuery<MyEntityObject> query = entityManager.createQuery(criteriaQuery);

return query.getSingleResult();