2013-10-17 9 views
8

Ricevo questo errore con il mio modello di ibernazione e non riesco a capire cosa c'è che non va.Hibernate - IllegalArgumentException si è verificato chiamando getter del modello

Tag.java:

@Entity 
@Table(name = "tag") 
public class Tag implements java.io.Serializable { 
    private Integer idTag; 
    private String name; 
    private Set<Question> questions = new HashSet<Question>(0); 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "idtag", unique = true, nullable = false) 
    public Integer getIdTag() { 
     return this.idTag; 
    } 

    public void setIdTag(Integer idtag) { 
     this.idTag = idtag; 
    } 

    [...] 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "tag") 
    public Set<Question> getQuestions() { 
     return this.questions; 
    } 

    public void setQuestions(Set<Question> questions) { 
     this.questions = questions; 
    } 

} 

Question.java:

@Entity 
@Table(name = "question") 
@Inheritance(strategy=InheritanceType.JOINED) 
public class Question implements java.io.Serializable { 
    protected Integer idQuestion; 
    protected Tag tag; 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "idquestion", unique = true, nullable = false) 
    public Integer getIdQuestion() { 
     return this.idQuestion; 
    } 

    public void setIdQuestion(Integer idquestion) { 
     this.idQuestion = idquestion; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "idtag") 
    public Tag getTag() { 
     return this.tag; 
    } 

    public void setTag(Tag tag) { 
     this.tag = tag; 
    } 

    [...] 
} 

QuestionText.java:

@Entity 
@Table(name = "question_text") 
@PrimaryKeyJoinColumn(name="idquestion") 
public class QuestionText extends Question implements java.io.Serializable {  
    [...] 
} 

E qui è quando appare questo errore (su query.list()):

q = "FROM QuestionText WHERE tag = :tag"; 
query = (Query) session.createQuery(q); 
query.setParameter("tag", tag); 
List<Question> data = query.list(); 

Stacktrace:

org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of model.Tag.idtag 

    org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:187) 
    org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:344) 
    org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4537) 
    org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4259) 
    org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:209) 
    org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:248) 
    org.hibernate.type.EntityType.getIdentifier(EntityType.java:510) 
    org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:174) 
    org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:66) 
    org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:612) 
    org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1875) 
    org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1836) 
    org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1816) 
    org.hibernate.loader.Loader.doQuery(Loader.java:900) 
    org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:342) 
    org.hibernate.loader.Loader.doList(Loader.java:2526) 
    org.hibernate.loader.Loader.doList(Loader.java:2512) 
    org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2342) 
    org.hibernate.loader.Loader.list(Loader.java:2337) 
    org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:495) 
    org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:357) 
    org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195) 
    org.hibernate.internal.SessionImpl.list(SessionImpl.java:1269) 
    org.hibernate.internal.QueryImpl.list(QueryImpl.java:101) 
    my.project.service.QuestionService.findCatItems(QuestionService.java:34) 

ho pensato che potrebbe essere un problema relativo al mio JOINED eredità, ma ottengo lo stesso errore con TABLE_PER_CLASS. Vedi qualcosa che ho sbagliato in questo?

+0

di poter postare completa analisi dello stack. con la causa principale. – Subin

risposta

9

provare in questo modo

Tag tag = tagDAO.findTagbyId(1); 
q = "FROM QuestionText qt WHERE qt.tag = :tag"; 
query = (Query) session.createQuery(q); 
query.setParameter("tag", tag); 
List<QuestionText> data = query.list(); 
+1

Oh! Devo dare un parametro oggetto, e non solo l'ID. Grazie mille, funziona. – Arthur

+0

@Arthur felice di sentirlo .... Prego. Grazie .. – Prabhakaran

+0

Puoi invece usare ['setParameter (" tag.id ", tagId)'] (http://stackoverflow.com/a/24777487/320036). Questo evita di recuperare l'oggetto tag dal database solo per usare l'ID. – z0r

0

Assicurarsi che la tabella abbia lo stesso tipo di Idtag. Che cos'è il rapporto di errore: digita la mancata corrispondenza con Intero.

+0

Grazie per la tua risposta, ma 'idtag' è un' int (11) 'in entrambe le tabelle. E l'uso variabile di 'tag' nella query è anche un' Integer'. – Arthur

+0

Posso avere uno script DB? In realtà posso correre con successo con il codice nel mio locale. Forse ha ancora problemi con lo script DB. Suggerisco di abbandonare l'intera tabella per consentire a JPA di aiutarti a creare una tabella (ad es. update) e poi testarla di nuovo. Se può funzionare con successo. quindi confronta lo script DB e lo script creato da JPA. – Bensson

+0

Il mio script DB è già stato generato da Entità di JPA Tools in Eclipse. Puoi ottenerlo [qui] (http://0bin.hoa.ro/paste/3aee85e7ac5025d019daebd3c67abaec02d47173#mEighrrVZFlUbe9l2O7Dgsbnn1GJ6FhLKgHR+mK+TZ0=). – Arthur

0

Questi metodi sono denominati in base alle convenzioni di denominazione dei bean? Direi di no

Provare setIdTag() e getIdTag().

@Id 
@GeneratedValue(strategy = IDENTITY) 
@Column(name = "idtag", unique = true, nullable = false) 
public Integer getIdtag() { 
    return this.idtag; 
} 

public void setIdtag(Integer idtag) { 
    this.idtag = idtag; 
} 
+0

Sono d'accordo, è meglio. Ma non risolve il mio problema. Modificherò la mia domanda con le giuste convenzioni di denominazione. – Arthur

Problemi correlati