Hibernate - IllegalArgumentException occurred calling getter of model

12,938

Try this way

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();
Share:
12,938
Arthur
Author by

Arthur

French IT engineer ; developper, sometimes.

Updated on June 14, 2022

Comments

  • Arthur
    Arthur about 2 years

    I'm getting this error with my hibernate model, and I can't figure out what's wrong.

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

    And here is when this error appears (on 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)
    

    I thought it might be an issue related to my JOINED inheritance, but I get the same error with TABLE_PER_CLASS. Do you see anything which I did wrong in this ?

  • Arthur
    Arthur over 10 years
    Thanks for you answer, but idtag is an int(11) in both tables. And variable tag use in the query is also an Integer.
  • Arthur
    Arthur over 10 years
    I agree, that's better. But it doesn't solve my issue. I will edit my question with the right naming conventions.
  • Bensson
    Bensson over 10 years
    Can i have you DB script? Actually I can run successful with code in my local. Maybe still have issue with DB script. I suggest drop whole table let JPA help you to create table(e.g.: <prop key="hibernate.hbm2ddl.auto">update</prop> ) and then test it again. If can run successful. then compare you DB script and the script which JPA created.
  • Arthur
    Arthur over 10 years
    My DB script has already been generated from Entities by JPA Tools in Eclipse. You can get it here.
  • Arthur
    Arthur over 10 years
    Oh! I need to give an object parameter, and not only the ID. Thanks a lot, it works.
  • z0r
    z0r about 8 years
    You can instead use setParameter("tag.id", tagId). This avoids fetching the tag object from the database just to use the ID.