gpt4 book ai didi

java - Spring Data 仅使用 EntityGraph 抛出 EntityNotFoundException

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:23:50 26 4
gpt4 key购买 nike

我目前正在处理一个我无法解释的错误,所以我在这里寻求帮助。

我正在使用 Spring Data 获取我的对象,它们都由名为“FlagCMS”的列管理,如果设置为“S”,则意味着该对象不应链接到任何其他新对象。这是一种直到现在都运行良好的软删除。

这些类是这样定义的(减去很多不相关的代码):

Action.java

@Entity
@Table(name = "action")
@Where(clause = FlagCMS.WHERE_NOSOFTDELETED)
@NamedEntityGraphs({
@NamedEntityGraph(name = "Action.maj", attributeNodes = {
@NamedAttributeNode("ouvragesAction")
}
})
public class Action {

@OneToMany(fetch = FetchType.LAZY, mappedBy = "action", cascade = CascadeType.ALL)
private Set<OuvrageAction> ouvragesAction = new HashSet<>();

@PreUpdate
protected void cascadeDelete() {
if (isDeleted()) {
getAllCascades().stream().filter(Objects::nonNull).forEach(SoftDeletable::setDeleted);
}
}

public Collection<OuvrageAction> getOuvragesAction() {
return ouvragesAction;
}

public void setOuvragesAction(final Set<OuvrageAction> ouvragesAction) {
this.ouvragesAction = ouvragesAction;
}

public List<Ouvrage> getOuvrages() {
return ouvragesAction.stream().map(OuvrageAction::get).collect(Collectors.toList());
}
}

OuvrageAction.java

@Entity
@Table(name = "ouvrage_action")
@Where(clause = FlagCMS.WHERE_NOSOFTDELETED)
@AttributeOverrides({
@AttributeOverride(name = "id", column = @Column(name = "id_action_ouvrage"))
})
public class OuvrageAction extends AbstractReferentielAction<Ouvrage> {

@ManyToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "id_ouvrage", nullable = false)
private Ouvrage ouvrage;

public OuvrageAction() {
super();
}

public OuvrageAction(Ouvrage ouvrage, Action action) {
super(action);
this.ouvrage = ouvrage;
}

public Ouvrage getOuvrage() {
return ouvrage;
}

public void setOuvrage(Ouvrage ouvrage) {
this.ouvrage = ouvrage;
}

}

Ouvrage.java

@Entity
@Immutable
@Table(name = "ouvrage")
@Where(clause = FlagCMS.WHERE_NOSOFTDELETED)
public class Ouvrage {

@Column(name = "code")
protected String code;

public String getCode() {
return code;
}

public void setCode(String code) {
this.code = code;
}
}

WHERE_NOSOFTDELETED 在 FlagCMS.java 中定义如下:

public static final String WHERE_NOSOFTDELETED = "(flag_cms = 'C' or flag_cms = 'M')";

我使用两种定义相似方法的不同 JpaRepositories 访问 Action 对象,一种保持延迟加载,另一种使用 EntityGraph:

@EntityGraph(value = "Action.maj", type = EntityGraphType.LOAD)
List<Action> findDistinctByCodeIn(List<String> codes);

List<Action> findDistinctByCodeIn(List<String> codes);

现在假设我有一个链接到 Ouvrage 对象的 Action 对象。第二个将 FlagCMS 设置为 S。使用惰性存储库,一切都很好,我得到了我的 Actions 并且可以通过它访问 Ouvragecode 属性。通过将存储库与 EntityGraph 一起访问操作,我只收到一个 EntityNotFoundException 告诉我 Ouvrage 对象不存在。

这对我来说似乎并不一致。

最佳答案

如果有人遇到同样的问题,那就是诀窍:原来 @Where 条件不会传播到通过链接表延迟加载的项目,但它会在它们加载实体图时传播。

因此,如果您真的想使用实体图,则必须从图中排除该特定属性,并在丢失交易之前手动加载所有这些属性。

关于java - Spring Data 仅使用 EntityGraph 抛出 EntityNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48230231/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com