com.something.SuperClass:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class SuperClass implements Serializable {
private static final long serialVersionUID = -695503064509648117L;
long confirmationCode;
@Id
@GeneratedValue(strategy = GenerationType.AUTO) // Causes exception!!!
public long getConfirmationCode() {
return confirmationCode;
}
public void setConfirmationCode(long confirmationCode) {
this.confirmationCode = confirmationCode;
}
}
com.something.SubClass:
@Entity
public abstract class Subclass extends SuperClass {
private static final long serialVersionUID = 8623159397061057722L;
String name;
@Column(nullable = false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Me dá esta exceção:
Caused by: org.hibernate.MappingException: Cannot use identity column key
generation with <union-subclass> mapping for: com.something.SuperClass
Qual é a melhor e mais conveniente maneira de gerar os IDs? Não quero mudar minha estratégia de herança.
hibernate
inheritance
jpa
class-table-inheritance
Martijn Pieters
fonte
fonte
Eu me pergunto se este é um problema específico de dialeto de banco de dados, já que assistindo a um tutorial do youtube com PostgreSQL como o banco de dados subjacente, vi que o criador do vídeo executou com sucesso um aplicativo com o @GeneratedValue padrão. No meu caso (o banco de dados subjacente é o MySQL), tive que modificar a estratégia @GeneratedValue para GenerationType.TABLE exatamente como o zoidbeck propõe.
Aqui está o vídeo: https://www.youtube.com/watch?v=qIdM4KQOtH8
fonte
GenerationType.SEQUENCE
. É por isso que funciona automaticamente lá. Não tem absolutamente nada a ver com PostgreSQLsINHERITS
.Concordo com a resposta de zoidbeck. Você precisa mudar a estratégia para:
Mas isso não é tudo, você precisa criar uma nova tabela, que conterá a sequência de chaves primárias da tabela do seu resumo. Modifique seu mapeamento para
E uma nova tabela no banco de dados deve ter a seguinte aparência:
Quando você executa sua aplicação, o Hibernate irá inserir uma linha onde
sequence_name
estará o nome da entidade (SuperClass
neste exemplo) e osequence_next_hi_value
valor será automaticamente incrementado e usado para novos registros de todas as tabelas de implementação das subclasses.fonte
Em nosso caso, usamos um banco de dados PostreSQL para desenvolvimento e produção e um banco de dados hsqldb na memória para testes. Estamos usando uma sequência em ambos os casos para gerar um id. Aparentemente, o
GenerationType.AUTO
padrão éSEQUENCE
para postgres, mas falhou em nossos testes locais (deve usar outro padrão para hsqldb).Portanto, a solução que funcionou para nós, use explicitamente
GenerationType.SEQUENCE
.fonte
você pode usar @MappedSuperclass para herança
fonte
Existe um padrão de conformidade SQL entre MySQL e PostgreSQL. PostgreSQL Postgres entende um bom subconjunto do SQL92 / 99 além de alguns recursos orientados a objetos para esses subconjuntos. Postgres é capaz de lidar com rotinas e regras complexas como consultas SQL declarativas, subconsultas, visualizações, suporte multiusuário, transações, otimização de consultas, herança e matrizes. Não suporta a seleção de dados em bancos de dados diferentes.
MySQL MySQL usa SQL92 como base. Funciona em inúmeras plataformas. Mysql pode construir consultas que podem unir tabelas de bancos de dados diferentes. Suporta junções externas esquerda e direita usando a sintaxe ANSI e ODBC. A partir do MySQL 4.1 a partir dessa versão, o MySQL tratará de subconsultas. Exibições suportadas a partir da versão 5.
Para uma descrição detalhada, visite. http://www-css.fnal.gov/dsg/external/freeware/pgsql-vs-mysql.html
fonte