Java 试图从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

我有两个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吗?我怎样才能避免呢


期待中的感谢

首先,您需要更改实体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()方法共享日志和您正在使用的位置。