Oggetto con id non è stato specificato sottoclasse

Ricevo un errore strano su mia richiesta.

Sto cercando di recuperare un elenco di entità di database (MySQL) con session.createCriteria().list() ma ricevo questo org.hibernate.WrongClassException.

Ho guardato questo errore e so cosa significa, ma non so come risolvere sul mio contesto.

Ho la seguente struttura del database:

CREATE TABLE vtiger_crmentity (
`crmid` int(19) NOT NULL
)

CREATE TABLE vtiger_account (
    `accountid` int(19) NOT NULL DEFAULT 0
)

CREATE TABLE vtiger_accountscf (
    `accountid` int(19) NOT NULL DEFAULT 0
)

CREATE TABLE vtiger_accoutshipads (
`accountaddressid` int(19) NOT NULL DEFAULT 0
)

CREATE TABLE vtiger_accountbillads (
    `accountaddressid` int(19) NOT NULL DEFAULT 0
)

Così, rapidamente spiegare, tutte le tabelle sono collegate da queste colonne id, e l’ultimo livello, il vtiger_accountscf tabella 1 vtiger_accountshipads e 1 vtiger_accountbillads. Tutte le tabelle hanno lo stesso PK.

Così ho fatto i miei corsi come questo (stub):

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "vtiger_crmentity")
public class VtigerCrmentity {
  @Id
  @Basic(optional = false)
  @Column(name = "crmid", nullable = false)
  public Integer getId() {
    return this.id;

  }
}


@Entity
@PrimaryKeyJoinColumn(name = "accountid")
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "vtiger_account")
public class VtigerAccount extends VtigerCrmentity {

}

@Entity
@PrimaryKeyJoinColumn(name = "accountid")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = "vtiger_accountscf")
public class VtigerAccountscf extends VtigerAccount {
}

@Entity
@PrimaryKeyJoinColumn(name = "accountaddressid")
@Table(name = "vtiger_accountbillads")
public class VtigerAccountbillads extends VtigerAccountscf {
}

@Entity
@PrimaryKeyJoinColumn(name = "accountaddressid")
@Table(name = "vtiger_accountshipads")
public class VtigerAccountshipads extends VtigerAccountscf {
}

Ed ecco il mio problema. Quando faccio:

getSession().createCriteria(VtigerAccountbillads.class).list();

Io sono sempre l’eccezione:

org.hibernate.WrongClassException: Object with id: 11952 was not of the specified subclass: VtigerAccountbillads (loaded object was of wrong class class VtigerAccountshipads)
    at org.hibernate.loader.Loader.instanceAlreadyLoaded(Loader.java:1391)
    at org.hibernate.loader.Loader.getRow(Loader.java:1344)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:611)
    at org.hibernate.loader.Loader.doQuery(Loader.java:829)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
    at org.hibernate.loader.Loader.doList(Loader.java:2533)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
    at org.hibernate.loader.Loader.list(Loader.java:2271)
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1716)
    at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)

Dal progetto di limitazioni, io non sto usando la molla o niente di simile per configurare la modalità di Sospensione e creare la sessione.

È la mia mappatura sbagliata?

all the tables are linked by the these id columns — quindi intendi dire che tutte le tabelle hanno lo stesso valore per la loro identificazione? Anche voi, si prega di chiarire che cosa si intende per in the last level, the vtiger_accountscf table has 1 vtiger_accountshipads and 1 vtiger_accountbillads.
Sì, lo stesso id per le tabelle. Volevo dire che il vtiger_accounts è entrato con vtiger_accountbillads e vtiger_accountshipads (indirizzi di un determinato account)

OriginaleL’autore Alberson Melo | 2014-08-27

1 risposta

  1. 4

    Può dirmi che cosa i record di dati che si hanno nel DB?

    Sembra che l’id tra tabelle diverse che ha lo stesso valore, in modo che quando la sospensione si sta cercando di caricare un’entità con un id specifico e se un’altra entità con lo stesso id è già presente in memoria, hibernate è lamentarsi di questo problema.

    Io non posso, ma sì, hanno lo stesso id. Se ho la mappa per loro come entità separate, senza estendere il genitore posso bypassare questo problema?
    Beh, non è esattamente la risposta, ma la tua visione della stessa Id mi ha fatto risolvere il mio problema. Ho rimosso il vtiger_accountbillads e vtiger_accountshipads dall’eredità e li singole tabelle. Come io non modifica né salvarli direttamente, questo ha risolto il mio problema. Grazie.
    Grazie Alberson per i vostri commenti, anche io ho una domanda, si sta cercando di caricare VtigerAccountshipads anche quando hai visto questo problema? A causa di questo problema viene SOLO quando ci sono 2 entità con lo stesso id in Sospensione di memoria.
    Stavo cercando di caricare un elenco di tutte VtigerAccountshipads. Un semplice session().createCriteria(VtigerAccountshipads.class).list().
    ok, ora l’eccezione senso. Grazie Alberson

    OriginaleL’autore Chaitanya

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *