【发布时间】:2022-11-06 04:47:50
【问题描述】:
我在 DB 中有 3 个表,在 Java 应用程序中有 3 个 JPA 实体。
@Data
@Entity
public class Fraud {
@Id
@Column(name = "id")
private Integer id;
@Column(name = "fraud_type")
private String fraudType;
@Column(name = "fraud_value")
private String fraudValue;
@OneToMany(mappedBy = "fraud", fetch = FetchType.EAGER)
private List<FraudActionEntity> fraudActions;
}
@Data
@Entity
public class FraudActionEntity {
@Id
@Column(name = "id")
private Integer id;
@ManyToOne
@JoinColumn(name = "fraud_id")
private Fraud fraud;
@ManyToOne
@JoinColumn(name = "action_id")
private Action action;
@Column(name = "enabled")
private Boolean enabled;
}
@Data
@Entity
public class Action {
@Id
@Column(name = "id")
private Integer id;
@Column(name = "attribute_key")
private String attributeKey;
@Column(name = "attribute_value")
private String attributeValue;
}
我的用例:-
对于某种类型的欺诈,我想遍历由该类型欺诈触发的所有操作并对其采取行动。
所以我想使用下面的 JPA 查询访问Fraud:-
@Repository
public interface FraudRepository extends JpaRepository<Fraud, Integer> {
public Fraud findByFraudTypeAndFraudValue(String fraudType, String fraudValue);
}
访问代码:
Fraud fraud = fraudRepository.findByFraudTypeAndFraudValue("Type", "Value");
log.info(fraud.getFraudActions().get(0).getAction());
当我上面的代码运行时,一切正常。
我也得到了fraud 和fraudActions 关联,没有出现任何错误。
我的印象是Fraud 和FraudActionEntity 两个实体都在互相获取热切地所以它应该给出一些错误,比如循环获取/无限获取循环,但它没有!
为什么它起作用了?究竟什么时候会给它像循环获取错误或无限获取循环错误这样的错误? 如果它确实给出了循环获取错误,我们可以使用惰性来修复它吗? 在@ManyToOne 一侧获取,如下所示:-
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "fraud_id") private Fraud fraud;
【问题讨论】:
-
你能包括你得到的堆栈跟踪吗?
标签: java spring hibernate spring-data-jpa orm