Hibernate: Использовал mappedBy для класса, который расширяет другой класс, аннотированный как JoinedSubclass? - PullRequest
14 голосов
/ 08 июня 2009

Не работает следующее:

@Entity
class Owner {

  @OneToMany(mappedBy="owner", cascade = {CascadeType.ALL})
  protected Set<B> getBSet() {
    ..
  }

}

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
class A {
   @ManyToOne
   public Owner getOwner() {
     ...
   }
}

@Entity
class B extends A {

}

Это вызывает исключение как таковое: org.hibernate.AnnotationException: mappedBy ссылается на неизвестное целевое свойство объекта: B.user в Owner.

Я стараюсь не копировать свойство "owner" в класс B (что, следовательно, "денормализует" и скопирует ключ владельца в обе таблицы, созданные для объекта A и B). Кроме того, мне бы очень хотелось, чтобы A и B были в отдельной таблице, и не нужно использовать дискриминатор с использованием наследования SingleTable.

Кроме того, я не могу понять, как сделать нечто подобное, используя @OneToOne между A и B (и не имея B, расширяющего A).

Ответы [ 3 ]

10 голосов
/ 27 октября 2009

Это странная странность, но она умышленная. У меня есть сообщение в блоге с дополнительной информацией, ссылками и обходным решением для решения JOINED.

6 голосов
/ 13 июня 2009

Попробуйте добавить targetEntity = Transaction.class. Это работало для меня, когда я использовал наследование SINGLE_TABLE. Я не пробовал это с JOIN.

@Entity
class Owner {

  @OneToMany(mappedBy="owner", cascade = {CascadeType.ALL}, targetEntity = Transaction.class)
  @Where(clause = "tableType='I'")
  protected Set<B> getBSet() {
    ..
  }

}
0 голосов
/ 08 июня 2009

Я бы дважды проверил вашу реальную реализацию. Я использовал ваш пример кода и после добавления @Id все заработало как положено. Даже IntelliJ говорит, что getBSet () связан с B.owner.

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