Hibernate:FetchMode Eager vs Lazy冲突

时间:2017-10-04 14:42:24

标签: java hibernate lazy-loading criteria eager-loading

我正在努力应对急切加载和延迟加载之间的冲突。 为了简单起见,我将使用猫和主人。 我想获取拥有具有特定元数据的猫的OwnerCat实体。

我的起点是OwnerCat.class,其中包含:

@Id
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_owner")
private Owner owner;

@Id
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "id_cat")
private Cat cat;

在我的Cat.class中我有一组CatMetadataValue.class,它返回引用cat类:由

定义的CatMetadataValue.class
@Id
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_cat")
private Cat cat;

@Id
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_metadata")
private CatMetadata catMetadata;

@Column(name = "value")
private String value;

我需要保持这种状态。

我的critera建筑

    final Criteria criteria = currentSession().createCriteria(OwnerCat.class)
            .createAlias("cat.catMetadataValues", "catMetadataValue")
            .createAlias("catMetadataValue.catMetadata", "catMetadata")
            .add(Restrictions.eq("catMetadata.name", "EYES_COLOR"));

这给了我一个OwnerCat.class,它包含了cat字段的惰性实体。

如果我从 OwnerCat.class 交换 Eager 获取类型 使用 CatMetadataValue.class 中的 Lazy 获取类型 该条件返回一个OwnerCat.class,其中包含对于cat字段的预先加载的实体。

我得出结论,因为它为同一个entityClass( Cat.class )找到了两个不同的fetchType:它检测到了最后一个。

有什么方法可以解决这个问题吗?

由于

0 个答案:

没有答案