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();
}
在服务中,我想为 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();
}