@GeneratedValue superclass polimorfa astratta su MySQL

In un’applicazione Spring MVC che utilizza Hibernate e MySQL, ho una superclass astratta BaseEntity che gestisce i valori degli ID per tutte le altre entity framework nel modello. Il campo id utilizza @GeneratedValue . Sto incontrando un problema ogni volta che il mio codice tenta di salvare una qualsiasi delle sottoclassi che estendono BaseEntity . Il problema arriva con la scelta di GenerationType per @GeneratedValue .

In ogni punto del mio codice, in cui una sottoclass di BaseEntity tenta di salvare il database MySQL sottostante, ottengo il seguente errore:

 ERROR SqlExceptionHelper - Table 'docbd.hibernate_sequences' doesn't exist 

Ho letto molti post su questo su SO e su google, ma si occupano di altri database (non di MySQL) o non si occupano di superclassi astratte. Non riesco a risolvere il problema utilizzando GenerationType.IDENTITY perché sto utilizzando una superclass astratta per gestire i campi id per tutte le quadro nel modello. Allo stesso modo, non posso usare GenerationType.SEQUENCE perché MySQL non supporta le sequenze.

Quindi, come posso risolvere questo problema?

Ecco il codice per BaseEntity.java :

 @Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public abstract class BaseEntity { @Id @GeneratedValue(strategy = GenerationType.TABLE) protected Integer id; public void setId(Integer id) {this.id = id;} public Integer getId() {return id;} public boolean isNew() {return (this.id == null);} } 

Ecco un esempio del codice per una delle quadro che estende BaseEntity :

 @Entity @Table(name = "ccd") public class CCD extends BaseEntity{ //other stuff } 

Ecco il DDL:

 CREATE TABLE IF NOT EXISTS ccd( id int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, #other stuff )engine=InnoDB;SHOW WARNINGS; 

Ecco il codice JPQL nel DAO:

  @Override @Transactional public void saveCCD(CCD ccd) { if (ccd.getId() == null) { System.out.println("[[[[[[[[[[[[ about to persist CCD ]]]]]]]]]]]]]]]]]]]]"); this.em.persist(ccd); this.em.flush(); } else { System.out.println("]]]]]]]]]]]]]]]]]] about to merge CCD [[[[[[[[[[[[[[[[[[[[["); this.em.merge(ccd); this.em.flush(); } } 

MODIFICARE:

Il motivo per cui non riesco a utilizzare @MappedSuperClass in questa situazione è che ho bisogno di avere relazioni ManyToOne che consentano l’utilizzo @MappedSuperClass di più sottotipi. Guarda la class AccessLog qui sotto come esempio. Ha un actor_entity e un target_entity . Possono esserci molti tipi di quadro attore e molti tipi di quadro bersaglio, ma tutte ereditano da BaseEntity . Questa ereditarietà consente alla tabella di dati di accesslogs sottostante in MySQL di avere solo un campo actor_entity_id e solo un campo target_entity_id invece di dover avere diversi campi per ognuno. Quando cambio @Entity sopra BaseEntity su @MappedSuperClass , viene generato un errore diverso che indica che AccessLog non riesce a trovare BaseEntity . BaseEntity richiede @Entity annotazione @Entity affinché AccessLog abbia proprietà polimorfiche.

 @Entity @Table(name = "accesslogs") public class AccessLog extends BaseEntity{ @ManyToOne @JoinColumn(name = "actorentity_id") private BaseEntity actor_entity; @ManyToOne @JoinColumn(name = "targetentity_id") private BaseEntity target_entity; @Column(name="action_code") private String action; //getters, setters, & other stuff } 

SECONDA MODIFICA:

Come suggerito da JBNizet, ho creato una tabella hibernate_sequences come segue:

 CREATE TABLE IF NOT EXISTS hibernate_sequences( sequence_next_hi_value int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY )engine=InnoDB;SHOW WARNINGS; 

Ma ora sto ottenendo il seguente errore:

 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'sequence_name' in 'where clause' 

Ecco l’Hibernate sql che causa l’errore, seguito dalle prossime 2 righe della traccia dello stack:

 Hibernate: select sequence_next_hi_value from hibernate_sequences where sequence_name = 'BaseEntity' for update ERROR MultipleHiLoPerTableGenerator - HHH000351: Could not read or init a hi value com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'sequence_name' in 'where clause' 

Come posso risolvere questo?