JPA: однонаправленный вопрос OneToMany - PullRequest
0 голосов
/ 27 марта 2011

У меня есть следующие классы:

class A{
   @OneToOne(cascade=CascadeType.ALL)
   private B b;
}

class C{
  @ManyToOne
  private A a;    
}

class B{
  @OneToOne
  private A a;

  @MapKey(name = "name")
  @OneToMany(cascade = CascadeType.ALL, ...)
  @JoinColumn(...)
  private Map<String C> cs;
}

Как мне указать отображение на B.cs, чтобы присоединиться, где B.a == C.a?

Возможно ли это? Или мне нужно изменить свойство C.a на C.b? (Я бы предпочел оставить все как есть, поскольку сущность B является просто вспомогательным классом.) Я также попытался изменить B на @Embeddable, но Map не поддерживается для встраиваемых объектов.

Ответы [ 2 ]

1 голос
/ 28 марта 2011

JPA требует, чтобы все отношения были по Id (внешний ключ ссылается на первичный ключ). Итак, вам нужно либо добавить @ManyToOne из C в B. Или убедитесь, что идентификатор B является внешним ключом для A (добавьте @Id в @OneToOne из B в A и удалите другой @Id для A). Если бы B был подклассом A вместо OneToOne, это также сработало бы.

Если вы используете EclipseLink, вы можете определить более сложные критерии для отношений. Вам нужно будет определить внешние ключи OneToMany, используя DescriptorCustomizer и API OneToManyMapping.

0 голосов
/ 27 марта 2011

Я думаю, что вы можете расширить B из A.

Если это не работает для вас, возможно, вы можете добавить временное свойство для ссылки на идентификатор A,

@Transient
Integer getId1() {
    return a.getId();
}

и присоединитесь к C, используя id1 вместо первичного ключа B.

Редактировать: Это не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...