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();
但这很丑,所以,有什么更好的解决方法吗?
答案 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可以实现的最大努力。