2013-10-17 22 views
8

我得到這個錯誤與我的休眠模型,我找不出什麼是錯的。Hibernate - 發生IllegalArgumentException異常調用模型的獲得者

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

這裏是出現此錯誤時(上query.list()):

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

堆棧跟蹤:

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) 

我想這可能是與我的JOINED繼承的問題,但我得到了同樣的錯誤與TABLE_PER_CLASS。你看到我在這做錯了什麼嗎?

+0

您可以發佈完整的堆棧跟蹤。有根本原因。 – Subin

回答

9

嘗試這種方式

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

哦!我需要給一個對象參數,而不僅僅是ID。非常感謝,它的工作原理。 – Arthur

+0

@Arthur很高興聽到....不客氣。謝謝.. – Prabhakaran

+0

你可以改爲使用['setParameter(「tag.id」,tagId)'](http://stackoverflow.com/a/24777487/320036)。這避免了從數據庫獲取標籤對象只是使用ID。 – z0r

0

確保您的表具有與Idtag相同的類型。錯誤報告是什麼:輸入與Integer不匹配。

+0

謝謝你的回答,但'idtag'是兩個表中的'int(11)'。查詢中使用的變量'tag'也是一個'Integer'。 – Arthur

+0

我可以讓你DB腳本?其實我可以在我的本地代碼運行成功。可能仍然有DB腳本的問題。我建議刪除整個表讓JPA幫助您創建表(例如:更新),然後再次測試它。如果可以運行成功。然後比較你的DB腳本和JPA創建的腳本。 – Bensson

+0

我的數據庫腳本已經由Eclipse中的JPA Tools實體生成。你可以得到它[這裏](http://0bin.hoa.ro/paste/3aee85e7ac5025d019daebd3c67abaec02d47173#mEighrrVZFlUbe9l2O7Dgsbnn1GJ6FhLKgHR+mK+TZ0=)。 – Arthur

0

這些方法是按照bean的命名約定命名的嗎?我會說不。

嘗試setIdTag()和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

我同意,那樣更好。但它不能解決我的問題。我將用正確的命名規則編輯我的問題。 – Arthur

相關問題