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, hibernate не сможет инициировать член b в A.
Кажется, что нет способа самостоятельно определить конструктор, однако, это может быть сделано с помощью двухфазной конструкции, например:
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();
Но это уродливо, так что, лучшее решение?