【发布时间】:2014-11-27 16:47:47
【问题描述】:
我遇到了一个未初始化的 Hibernate 实体问题。
似乎它仍在返回一个未初始化的代理...
如果我查看我的调试信息,我希望我的实体会被初始化。
但它看起来像下面这样:
entity = {SomeEntity_$$_jvst47c_1e@9192}"SomeEntityImpl@1f3d4adb[id=1,version=0]"
handler = {org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer@9196}
interfaces = {java.lang.Class[2]@9197}
constructed = true
persistentClass = {java.lang.Class@3605}"class SomeEntityImpl"
getIdentifierMethod = null
setIdentifierMethod = null
overridesEquals = true
componentIdType = null
replacement = null
entityName = {java.lang.String@9198}"SomeEntityImpl"
id = {java.lang.Long@9199}"1"
target = {SomeEntityImpl@9200}"SomeEntityImpl@1f3d4adb[guid=<null>,id=1,version=0]"
initialized = true
readOnly = true
unwrap = false
session = {org.hibernate.internal.SessionImpl@6878}"SessionImpl(PersistenceContext[entityKeys=[EntityKey[EntityReferenceImpl#2], EntityKey[SomeEntityImpl#1], EntityKey[...
readOnlyBeforeAttachedToSession = null
sessionFactoryUuid = null
allowLoadOutsideTransaction = false
请注意,我的 Hibernate POJO 仍然只包含 handler,即使在进行了显式初始化之后...
在我的调试视图中,当我展开 target 节点时,我可以看到“真实”属性值(上面未显示)。
我在做什么:
EntityReferenceImpl entityReference = findEntityReference(session);
SomeEntity entity = null;
if (entityReference != null) {
// initialize association using a left outer join
HibernateUtil.initialize(entityReference.getSomeEntity());
entity = entityReference.getSomeEntity();
}
return entity;
注意HibernateUtil.initialize 电话!
SomeEntity映射:
public class SomeEntityImpl extends AbstractEntity implements SomeEntity {
@OneToMany(mappedBy = "someEntity", fetch = FetchType.EAGER, targetEntity = EntityReferenceImpl.class, orphanRemoval = true)
@Cascade(CascadeType.ALL)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private Set<EntityReference> entityReferences = new HashSet<>();
@Target(EntityName.class)
@Embedded
private Name name;
@Target(EntityAddress.class)
@Embedded
private Address address;
...
}
EntityReferenceImpl映射:
public class EntityReferenceImpl extends AbstractEntity implements EntityReference {
@ManyToOne(optional = true, fetch = FetchType.LAZY, targetEntity = SomeEntityImpl.class)
@JoinColumn(name = "entity_id")
private SomeEntity someEntity;
...
}
那么副作用是什么:当 POJO 稍后带有更新的属性时,我仍然具有相同的结构(如上所述)并且我可以在 target 节点下看到更新的属性。
但是当我尝试使用session.merge() 或session.update() 或session.saveOrUpdate() 更新实体时,Hibernate 不会检测到“脏”属性,也不会调用数据库的更新查询。
有人对这种奇怪的行为有一些线索吗?我已经尽我所能尝试了一切,但没有任何结果。
非常欢迎所有帮助!
【问题讨论】:
-
HibernateUtil类来自什么包?你不用Hibernate类吗? -
你解决了这个问题吗?我面临着类似的问题
标签: java hibernate jpa orm proxy