Как объявить дескриптор интерфейса для независимых объектов в общем интерфейсе, используя EclipseLink? - PullRequest
1 голос
/ 04 апреля 2011

У нас есть ситуация, когда нам нужно связать разные объекты под одним атрибутом и использовать этот атрибут в запросе.Проект использует JPA с EclipseLink в качестве реализации.

Пример кода для иллюстрации: (реальная проблема намного сложнее)

interface I1 {
  public int getData();
}

@Entity
class E1 implements I1 {
  public int id;
  public String someData;

  public int getData() { return someData; }
}

@Entity
class E2 implements I1 {
  public int id;
  public String someOtherData;

  public int getData() { return someOtherData; }
}


@Entity
class Test {
  // we want to handle this as if it was a real entity using the I1 Interface
  // Since it is a oneToMany mapping we cannot use eclipselinks
  // VariableOneToOne mapping
  // something like this should be possible 
  // SELECT t.refToEntities From Test t where t.data == 'Some String'  
  public List<I1> refToEntities;
}

По историческим причинам объекты не имеют отношения наследования, но имеют общие данные, которыеабстрагируется под общим интерфейсом.Сейчас мы сталкиваемся с проблемой, что у нас есть другая сущность, которая хочет связать эти сущности, используя общий интерфейс в отношениях один ко многим.В идеале отношение должно быть запрашиваемым с использованием JPQL, но с использованием специальных методов EclipseLink также хорошо.

Подводя итог, мы хотим иметь VariableOneToOne Отображение для отношения OneToMany .

Документация, которую я нашел до сих пор, указывает, что можно создать RelationalDescriptor для интерфейсов, но неясно, как передать этот дескриптор в сеанс в JPA Сценарий и как настроить InterfacePolicy , чтобы использовать интерфейс в качестве общего типа для базовых объектов.

ТАК кто-нибудь знает, как это сделать, или может указать нам рабочий код?

1 Ответ

1 голос
/ 05 апреля 2011

Возможно, лучше использовать наследование вместо интерфейса.

Или иметь список каждого типа сущности вместо только интерфейса.

EclipseLink поддерживает только VariableOneToOne, а не VariableOneToManyПожалуйста, зарегистрируйте запрос на расширение для этого.

Вы можете определить RelationalDescriptor для интерфейса с помощью SessionCustomizer, просто создать его экземпляр, установить интерфейс с помощью descriptor.setJavaInterface (Il.class) и добавить любые общие ключи запроса.

Вы могли бы потенциально использовать этот интерфейс как цель OneToManyMapping (определено в коде).Однако вы не сможете присоединиться к нему в JPQL.

...