我有两个Hibernate模型,如下所示
@Entity
@Table(name = "table_a")
public class A{
private Integer p1;
private B b;
@Id
@Column(name="id_a")
public Integer getP1() {
return p1;
}
public void setP1(Integer p1) {
this.p1 = p1;
}
@ManyToOne
@JoinColumn(name = "t1")
public B getB() {
return b;
}
public void setB(B b) {
this.b = b;
}
@Transient
public String getBVal(){
if(b != null){
return b.getT2();
}
return null;
}
}
,另一个模型B看起来像这样
@Entity
@Table(name = "table_b")
public class B{
private int t1;
private String t2;
@Id
@Column(name = "t1")
public int getT1() {
return t1;
}
public void setT1(int t1) {
this.t1 = t1;
}
@Column(name = "t2")
public String getT2() {
return t2;
}
public void setT2(String t2) {
this.t2 = t2;
}
}
问题是当我在我的代码中使用A类的“getBVal”方法时偶尔会抛出Nullpointer异常,这对我来说很奇怪 因为我已经在相应的瞬态方法中进行了空检查! 不知道为什么这个npe会来,我怎么能避免这个呢?
感谢预期!
答案 0 :(得分:0)
首先,您需要将实体A的关系映射更改为B.
由于B不是属性而是关系,因此映射它的正确方法如下:
@OneToOne // Or @ManyToOne depending on your cardinality
@JoinColumn(name = "tx_b")
public B getB() {
return b;
}
@OneToOne
和@ManyToOne
关系映射的默认提取类型为FetchType.EAGER
,这意味着当您加载实体 A 时,关联的 B 实体也将被加载。
如果不使用其余代码(使用getBVal()方法),我就说不出更多。