Переопределить @OneToMany targetEntity в подклассе? - PullRequest
2 голосов
/ 06 октября 2011

Рассмотрим следующий пример:

public interface Bar {
}

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public DefaultBar implements Bar {

  @Id
  @GeneratedValue(strategy = GenerationType.TABLE)
  private long id;

}

@Entity
public class Foo {

  @Id
  @GeneratedValue(strategy = GenerationType.TABLE)
  private long id;

  @OneToMany(cascade = CascadeType.ALL, targetEntity = DefaultBar.class)
  @JoinColumn(name = "FOO_ID")
  private Collection<Bar> bars;

  public Collection<Bar> getBars() {
    return bars;
  }
}

Это будет работать нормально.НО - предположим, я сделаю подкласс Foo;скажи FooFoo.И я хочу, чтобы ассоциация «баров» тоже указала на новую реализацию Bar.Скажем:

@Entity
public NewBar extends DefaultBar {

}

А теперь я хотел бы аннотировать FooFoo, чтобы он устанавливал целевую сущность поля "bars" в класс NewBar.

@Entity
@AssociationOverride(name="bars", ???????)
public class FooFoo extends Foo {

}

Я заметил аннотацию @AssociationOverride, но на первый взгляд не позволяет переопределить целевой объект.Или это?

Ответы [ 2 ]

3 голосов
/ 09 октября 2011

Кажется, нет способа сделать это в контексте JPA.Hibernate имеет специальные метааннотации для переопределения аннотации OneToMany надкласса.

Между тем, похоже, что аннотация @AssociationOverride применяется только к классам, помеченным @MappedSuperclass.Но тогда их нельзя использовать в качестве целевого объекта в ассоциации OneToMany.

Проблема курицы и яйца на самом деле ... Или это так?

Java не позволяет переопределять поля.Но это касается методов.Если суперкласс использует доступ к свойству, ТО работает.Позвольте подклассу переопределить получатель, и все!: -)

0 голосов
/ 06 октября 2011

Пока вы используете наследование в Bar, вам не нужно ничего делать.Если FooFoo имеет отношения к NewBar, они будут считаны обратно.

В противном случае вы можете добавить новое поле в NewBar или переместить отношение Bar вниз к подклассам.

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