首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双向OneToMany JPA映射,双方都具有急切的获取功能。

双向OneToMany JPA映射,双方都具有急切的获取功能。
EN

Stack Overflow用户
提问于 2022-10-20 13:44:19
回答 1查看 61关注 0票数 0

我在DB中有3个表,在Java应用程序中分别有3个JPA实体。

代码语言:javascript
复制
@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);

}

我的用例

在某种类型的欺诈中,我想遍历所有从这类欺诈中触发的行为,并对它们采取行动。

存取码

代码语言:javascript
复制
Fraud fraud = fraudRepository.findByFraudTypeAndFraudValue("Type", "Value");
log.info(fraud.getFraudActions().get(0).getAction());  

当我运行上面的代码时,一切正常。我也得到了fraudfraudActions关联,没有任何错误。

我的印象是,由于两个实体FraudFraudActionEntity都在急切地相互取回,所以它应该会产生一些错误,比如循环提取/无限获取循环,但是它没有!

为什么起作用了?什么时候会出现类似循环取错或无限取环错误这样的错误?如果它确实给出了循环获取错误,那么我们是否可以在@ManyToOne @ManyToOne端使用延迟获取来修复它,如下所示:

代码语言:javascript
复制
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "fraud_id")
private Fraud fraud;
EN

回答 1

Stack Overflow用户

发布于 2022-10-20 15:44:37

更新:针对LazyInitializationException的一个简单且非常有效的工作是用@Transactional注释对您的方法进行注释。这将在执行方法时创建和维护事务,从而允许代码对DB的惰性init对象进行必要的调用。在这里了解更多

JPA存储库方法的返回类型应该是实体对象的列表,因为结果可能不止一行(这可能是获得fraud变量的null的原因)。

关于获取策略,您可以在特定的关联或可能的其他战略上使用急切。一个可能的解决方案是进行第二个查询,以防需要延迟加载的FraudAction对象列表。

另外,请注意避免使用lombok数据注释,并且始终确保您的实体/DTO类中有一个NoArgsConstructor (在您的例子中,@Data意外地添加了这一点,因为它包含@RequiredArgsConstructor,并且没有任何最终变量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74140943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档