试图在hibernate中从另一个模型访问一个延迟加载的模型

时间:2017-04-24 10:45:10

标签: 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;
        }

        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异常,这对我来说很奇怪 因为我已经在相应的瞬态方法中进行了空检查! 不知道为什么这个np​​e会来,我怎么能避免这个呢?

感谢预期!

1 个答案:

答案 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()方法),我就说不出更多。