2013-10-17 9 views
8

Otrzymuję ten błąd z moim modelem hibernacji i nie mogę wykombinować, co jest nie tak.Hibernate - IllegalArgumentException wystąpił wywołujący getter modelu

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 {  
    [...] 
} 

I tu jest, gdy pojawia się ten błąd (na 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) 

Pomyślałem, że może to być problem związany z moim JOINED dziedziczenia, ale pojawia się ten sam błąd z TABLE_PER_CLASS. Czy widzisz coś, co zrobiłem źle w tym?

+0

można zakładać pełną ślad stosu. z podstawową przyczyną. – Subin

Odpowiedz

9

Spróbuj ten sposób

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! Muszę podać parametr obiektu, a nie tylko identyfikator. Wielkie dzięki, działa. – Arthur

+0

@Arthur chętnie to słyszy .... Nie ma za co. Dzięki .. – Prabhakaran

+0

Zamiast tego możesz użyć ['setParameter (" tag.id ", tagId)'] (http://stackoverflow.com/a/24777487/320036). Pozwala to uniknąć pobierania obiektu znacznika z bazy danych tylko po to, aby użyć identyfikatora. – z0r

0

Upewnij się, że tabela ma ten sam typ, co identyfikator Idtag. Co to jest raport o błędzie: wpisz niezgodność z liczbą całkowitą.

+0

Dziękuję za odpowiedź, ale 'idtag' to' int (11) 'w obu tabelach. Zmienna 'tag' używana w zapytaniu to także' Integer'. – Arthur

+0

Czy mogę mieć skrypt DB? Właściwie mogę uruchomić kod z moim lokalnym. Może nadal masz problem ze skryptem DB. Sugeruję upuścić całą tabelę, aby JPA pomogło ci utworzyć tabelę (np .: update), a następnie przetestuj ją ponownie. Jeśli uda się uruchomić. następnie porównaj skrypt DB ze skryptem utworzonym przez JPA. – Bensson

+0

Mój skrypt DB został już wygenerowany przez Entities by JPA Tools w Eclipse. Możesz go zdobyć [tutaj] (http://0bin.hoa.ro/paste/3aee85e7ac5025d019daebd3c67abaec02d47173#mEighrrVZFlUbe9l2O7Dgsbnn1GJ6FhLKgHR+mK+TZ0=). – Arthur

0

Czy metody te są nazywane zgodnie z konwencjami nazewnictwa fasoli? Powiedziałbym nie.

Wypróbuj setIdTag() i 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

Zgadzam się, to jest lepsze. Ale to nie rozwiązuje mojego problemu. Będę edytować moje pytanie z odpowiednimi konwencjami nazewnictwa. – Arthur

Powiązane problemy