我在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;
}
@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端使用延迟获取来修复它,如下所示:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "fraud_id")
private Fraud fraud;发布于 2022-10-20 15:44:37
更新:针对LazyInitializationException的一个简单且非常有效的工作是用@Transactional注释对您的方法进行注释。这将在执行方法时创建和维护事务,从而允许代码对DB的惰性init对象进行必要的调用。在这里了解更多。
JPA存储库方法的返回类型应该是实体对象的列表,因为结果可能不止一行(这可能是获得fraud变量的null的原因)。
关于获取策略,您可以在特定的关联或可能的其他战略上使用急切。一个可能的解决方案是进行第二个查询,以防需要延迟加载的FraudAction对象列表。
另外,请注意避免使用lombok数据注释,并且始终确保您的实体/DTO类中有一个NoArgsConstructor (在您的例子中,@Data意外地添加了这一点,因为它包含@RequiredArgsConstructor,并且没有任何最终变量。
https://stackoverflow.com/questions/74140943
复制相似问题