【问题标题】:Hibernate - IllegalArgumentException occurred calling getter of modelHibernate - IllegalArgumentException 发生调用模型的 getter
【发布时间】:2013-10-25 14:48:12
【问题描述】:

我的休眠模型出现此错误,我不知道出了什么问题。

标签.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;
    }

}

问题.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;
    }

    [...]
}

问题文本.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 相同的错误。你看到我在这方面做错了什么吗?

【问题讨论】:

  • 你能发布完整的堆栈跟踪吗?有根本原因。

标签: java mysql hibernate inheritance hibernate-annotations


【解决方案1】:

试试这个方法

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();

【讨论】:

  • 哦!我需要提供一个对象参数,而不仅仅是 ID。非常感谢,它有效。
  • 您可以改用setParameter("tag.id", tagId)。这避免了从数据库中获取标签对象只是为了使用 ID。
【解决方案2】:

确保您的表格与 Idtag 具有相同的类型。错误报告是什么:type mismatch with Integer。

【讨论】:

  • 感谢您的回答,但idtag 在两个表中都是int(11)。而查询中使用的变量tag也是Integer
  • 我可以给你 DB 脚本吗?实际上,我可以在本地使用代码成功运行。数据库脚本可能仍然存在问题。我建议删除整个表,让 JPA 帮助您创建表(例如: update )然后再次测试它。如果可以运行成功。然后比较你的 DB 脚本和 JPA 创建的脚本。
  • 我的数据库脚本已经由 Eclipse 中的 JPA 工具从实体生成。你可以得到它here
【解决方案3】:

这些方法是否根据 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;
}

【讨论】:

  • 我同意,这样更好。但这并不能解决我的问题。我将使用正确的命名约定来编辑我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 2011-12-07
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
相关资源
最近更新 更多