#hibernate #hibernate-mapping
#переход в спящий режим #переход в спящий режим-сопоставление
Вопрос:
У меня есть три класса A, B, C, где
public class A{
@Id
@Column(name = "id", insertable = false, updatable = false)
private String id;
@Column(name = "bid", insertable = false, updatable = false)
String b_id
}
public class B{
@id
@Column(name = "id", insertable = false, updatable = false)
private String id;
@Column(name = "cid", insertable = false, updatable = false)
String c_id;
}
public class C{
@Id
@Column(name = "id", insertable = false, updatable = false)
private String id;
@Column(name = "property", insertable = false, updatable = false)
private String property
}
Я хотел бы в одном выбрать get из спящего режима pojo c.property
Я заметил, что не могу достичь этого с помощью @JoinTable
, потому что первичный ключ B не является комбинацией ключей a amp; c.
Я подумал о выполнении одного из следующих :
-
Использование
@loader
с NamedQuery. Это кажется плохой идеей, я хочу, чтобы при каждом выборе таблица создавалась из NamedQuery@Entity @Table(name = "Aamp;Bamp;C") @Loader(namedQuery = "all") @NamedNativeQuery(name = "all", query = "select * from A a join B b on a.bid = a.aid join C c on b.cid = c.id )
-
возможно ли это с использованием @SecondaryTables? для 3?
Есть ли другое хорошее решение?
10x.
Ответ №1:
У вас не должно быть идентификаторов других объектов в качестве полей ваших объектов. Похоже, у вас должен быть просто ManyToOne между A и B (несколько As относятся к одному и тому же B) и ManyToOne между B и C (несколько Bs относятся к одному и тому же C).
Таким образом, вы должны иметь в A вместо b_id
:
@ManyToOne
@JoinColumn(name = "bid")
private B b;
и аналогично, в B:
@ManyToOne
@JoinColumn(name = "cid")
private C c;
Теперь, когда вы хотите получить свойство A, вам просто нужно вызвать
String property = a.getB().getC().getProperty();
Комментарии:
1. Я не могу изменить B и C