休眠手动控制对象构造

时间:2018-09-26 07:38:39

标签: java hibernate

Hibernate假定所有对象成员均来自其负责的SQL数据库。如果某个对象的某些字段不是来自SQL,例如数据源是另一个NoSQL数据库或仅仅是文件,该怎么办?

    class A {
        public B b;
        public A(int bId) {
            //b object is in an self defined cache which the 
            //data source is not SQL beneath hibernate
            b = CacheOfB.get(bId); 
        }
    }

    class B {
        int id;
        int other_property;
    }

因此,如果我将@Embeddable添加到B,让A的表包含b_id字段,休眠将无法初始化A中的b成员。

似乎没有办法自定义构造函数,但是可以通过两阶段构造来完成,例如:

class A {
    @Transient
    public B b;
    @Column(name="b_id")
    private int bId;
    void initMemberB() {
        this.b = CacheOfB.get(bId);
    }
}
A a = session.get(A.class, aId);
a.initMemberB();

但这很丑,所以,有什么更好的解决方法吗?

1 个答案:

答案 0 :(得分:0)

我发现jpa批注@ PostLoad,@ PrePersist起作用。

class A {
    @Transient
    public B b;
    @Column(name="b_id")
    private int bId;
    @PostLoad
    private void initMemberB() {
        this.b = CacheOfB.get(bId);
    }
    @PrePersist
    private void setBId() {
        this.bId = this.b.id;
    }
}
A a = session.get(A.class, aId);
assert a.b.id == a.bId;

但是,这仍然是两阶段构造,但是步骤是隐藏的。我认为这是jpa / hibernate可以实现的最大努力。