Hibernate наследование - OneToMany с 2 классами, которые расширяют родительский не работает - PullRequest
1 голос
/ 19 июня 2019

У меня есть 3 сущности:

@Data
@AllArgsConstructor 
@Entity 
@Table(name = "beneficiary") 
@Inheritance 
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "type") 
public abstract class Beneficiary {   
    public Beneficiary() {}

      @Id private String id;

      private String description; 
}


@Data
@Entity
@DiscriminatorValue("company")
@EqualsAndHashCode(callSuper = true)
public class BeneficiaryCompany extends Beneficiary {
  public BeneficiaryCompany() {
    super();
  }

  public BeneficiaryCompany(String id, String description) {
    super(id, description);
  }
}


@Data
@Entity
@DiscriminatorValue("person")
@EqualsAndHashCode(callSuper = true)
public class BeneficiaryPerson extends Beneficiary {
  public BeneficiaryPerson() {}

  public BeneficiaryPerson(String id, String description) {
    super(id, description);
  }
}

В другом классе я хочу иметь 2 отдельные коллекции:

@Data
@AllArgsConstructor
@Entity
@Table(name = "transaction")
public class Transaction {

  public Transaction() {}

  @Id private String id;

  private String description;

  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, targetEntity = BeneficiaryCompany.class)
  @JoinColumn(name = "transaction_id", nullable = false)
  private Set<BeneficiaryCompany> beneficiaryCompanies;

  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true,targetEntity = BeneficiaryPerson.class)
  @JoinColumn(name = "transaction_id", nullable = false)
  private Set<BeneficiaryPerson> beneficiaryPeople;
}

Проблема в том, что каждый бенефициар был доставлен в компании-бенефициары, и бенефициар. Люди в отладчике говорят мне, что:

Невозможно оценить выражение Метода исключение 'org.hibernate.WrongClassException'.

Записи базы данных выглядят нормально (DiscriminatorColumn был создан). В чем может быть проблема? Почему BeneficiaryCompanies содержит объекты BeneficiaryPerson?

@ EDIT: Для извлечения записей я использую репозитории SpringData JPA.

1 Ответ

2 голосов
/ 19 июня 2019

Используйте @MappedSuperclass в вашем базовом классе Beneficiary

Александр Петров абсолютно прав.Вы должны удалить @Entity, потому что суперкласс не является сущностью.При работе с расширением класса наследования вы можете использовать аннотацию @MappedSuperclass для базового класса, в вашем случае это Beneficiary.

Редактировать: Эта очень хорошая статьяВы можете обратиться к.

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