переход в спящий режим — получение значения с использованием таблицы соединений, где ключ, используемый в объединенной таблице, не является основным ключом

#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.

Я подумал о выполнении одного из следующих :

  1. Использование @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 )
      
  2. возможно ли это с использованием @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