NullPointerException 和 OneToMany Eager Fetch

NullPointerException and OneToMany Eager Fetch

在服务中,我想为 BudgetGeschaeftfeld 设置投注。 设置好Betrag后,需要调用budgetPlan的一个方法Fetch.Eager来更新自己的Betrag。但是我得到一个 NullPointerException

java.lang.NullPointerException: Cannot invoke "com.bm.ent.budgetplan.BudgetPlan.berechnePrognose()" because "this.budgetPlan" is null

为什么会这样?我能做些什么来解决它?

我的Class代码:

@Entity(name= "Budgetgeschaftsfeld")
@Getter
@Setter
@NoArgsConstructor
public class BudgetGeschaeftsfeld extends Budget{
@JsonIgnore
@OneToMany(
        mappedBy="budgetGeschaftfeld",
        cascade=CascadeType.ALL,
        orphanRemoval=true,
        targetEntity = BudgetMarke.class
        )
private List<BudgetMarke> childBudgets= new ArrayList<>();

@JsonIgnore
@ManyToMany
@ToString.Exclude
private List<User> users= new ArrayList<>();

@JsonIgnore
@ManyToOne( fetch=FetchType.EAGER,
        cascade=CascadeType.PERSIST)
@JoinColumn(name="pid")
@ToString.Exclude
private BudgetPlan budgetPlan;

public BudgetGeschaeftsfeld(String name, BudgetTyp typ, Double betrag, String kommentar) {
    super(name, typ, betrag, kommentar);
}


public void setBetrag(Double betrag) {
    if (this.getBudgetTyp()==BudgetTyp.DYNAMISCH) {
        super.setBetrag(this.betragChildBudgets());
    }else {
     super.setBetrag(betrag);   
    }
    budgetPlan.berechnePrognose();
}

我认为这是因为您命名了一个 class 但没有在内存中设置一个实例 class,因为在您的代码中使用它与 = null 相同:

private BudgetPlan budgetPlan;

因此,当您的代码使用 budgetPlan.berechnePrognose(); 执行时,它无法在内存中分配任何内容。

尝试:

@JsonIgnore
@ManyToOne( fetch=FetchType.EAGER,
        cascade=CascadeType.PERSIST)
@JoinColumn(name="pid")
@ToString.Exclude
private BudgetPlan budgetPlan = new BudgetPlant();

免责声明:我对其中的所有注释没有经验,所以我可能错过了整个代码的逻辑,但只需确保 BudgetPlan budgetPlan != null.

答案是

@JsonIgnore
@ManyToOne( fetch=FetchType.Lazy,
    cascade=CascadeType.PERSIST)
@JoinColumn(name="pid")
@ToString.Exclude
private BudgetPlan budgetPlan;

然后在调用方法之前获取预算计划

public void setBetrag(Double betrag) {
    if (this.getBudgetTyp()==BudgetTyp.DYNAMISCH) {
        super.setBetrag(this.betragChildBudgets());
    }else {
     super.setBetrag(betrag);   
    }
    detBudgetPlan().berechnePrognose();
}