Estou trabalhando em um aplicativo para rastrear contas de clientes. Cada cliente pode ter várias contas. O desafio é que o objeto de conta é polimórfico. Há uma classe abstrata Account
com 2-3 métodos e, atualmente, há 2 subtipos SavingsAccount
e CreditAccount
.
O que tentei foi fazer com que o Account
objeto usasse a @MappedSuperclass
anotação e, então, cada classe concreta tivesse as @Entity
anotações normalmente.
O problema parece ser o mapeamento do meu objeto Cliente
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name="customer_id", referencedColumnName = "id")
List<Account> accounts = new ArrayList<>();
Quando uso isso, recebo um aviso do Spring no meu IDE, mas em tempo de execução recebo esse erro.
com.example.models.Customer.accounts' targets the type 'com.example.models.Account' which is not an '@Entity' type
Não há como ter um mapeamento @OneToMany contra uma lista de objetos polimórficos? Mesmo se eles estivessem armazenados na mesma tabela?
@MappedSuperclass
é usado para reutilizar propriedades comuns em@Entity
classes anotadas e não se aplica diretamente ao seu caso atual. No entanto, um exemplo de uso correto para@MappedSuperclass
no seu caso seria:e deixe
Customer
herdarMyMappedSuperclass
.Você precisa anotar sua
Account
classe base com@Entity
and@Inheritance
. Isso habilita consultas polimórficas, onde você pode consultar a classe base e recuperar todas as suas subclasses. Se estiver usando uma única tabela para todas as subclasses, aAccount
classe pode ficar assim:Suas subclasses ficarão assim
Verifiquei o código acima com esta implementação do Cliente:
Repositório do Cliente
Migração Flyway (Postgresql)
Configuração do contêiner de teste do Postgres
Teste