Java 试图从hibernate中的另一个模型访问懒散加载的模型
我有两个Hibernate模型,如下所示Java 试图从hibernate中的另一个模型访问懒散加载的模型,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,我有两个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; } pu
@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吗?我怎样才能避免呢
期待中的感谢 首先,您需要更改实体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()方法),我就说不出更多了。您能分享日志吗?非常感谢。检查数据库的完整性。当您指向另一个表中不存在的id时,可能会发生这种情况。我已经在实体中定义了@manytone关系。抱歉,我在发布答案时没有看到更新的问题。请使用getBVal()方法共享日志和您正在使用的位置。