2013-10-17 11 views
8

Tôi nhận được lỗi này với mô hình ngủ đông của tôi, và tôi không thể tìm ra những gì sai.Hibernate - IllegalArgumentException xảy ra gọi getter của mô hình

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

Và đây là khi lỗi này xuất hiện (trên 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) 

tôi nghĩ nó có thể là một vấn đề liên quan đến JOINED thừa kế của tôi, nhưng tôi nhận được lỗi tương tự với TABLE_PER_CLASS. Bạn có thấy bất cứ điều gì mà tôi đã làm sai trong điều này?

+0

bạn có thể đăng bài đầy đủ stack trace. với nguyên nhân gốc rễ. – Subin

Trả lời

9

Hãy thử cách này

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

Ồ! Tôi cần cung cấp thông số đối tượng và không chỉ ID. Cảm ơn rất nhiều, nó hoạt động. – Arthur

+0

@Arthur vui mừng khi nghe nó .... Bạn được chào đón. Cảm ơn .. – Prabhakaran

+0

Thay vào đó, bạn có thể sử dụng ['setParameter (" tag.id ", tagId)'] (http://stackoverflow.com/a/24777487/320036). Điều này tránh tìm nạp đối tượng thẻ từ cơ sở dữ liệu chỉ để sử dụng ID. – z0r

0

Đảm bảo rằng bảng của bạn có cùng loại với Idtag. Báo cáo lỗi là gì: loại không phù hợp với Số nguyên.

+0

Cảm ơn bạn đã trả lời, nhưng 'idtag' là một' int (11) 'trong cả hai bảng. Và sử dụng 'tag' biến trong truy vấn cũng là một' Số nguyên'. – Arthur

+0

Tôi có thể cho bạn tập lệnh DB không? Trên thực tế tôi có thể chạy thành công với mã trong địa phương của tôi. Có thể vẫn gặp sự cố với tập lệnh DB. Tôi đề nghị thả toàn bộ bảng để JPA giúp bạn tạo bảng (ví dụ: cập nhật) và sau đó kiểm tra lại. Nếu có thể chạy thành công. sau đó so sánh kịch bản lệnh DB của bạn và tập lệnh mà JPA đã tạo. – Bensson

+0

Tập lệnh DB của tôi đã được tạo ra từ Thực thể bằng Công cụ JPA trong Eclipse. Bạn có thể tải xuống [tại đây] (http://0bin.hoa.ro/paste/3aee85e7ac5025d019daebd3c67abaec02d47173#mEighrrVZFlUbe9l2O7Dgsbnn1GJ6FhLKgHR+mK+TZ0=). – Arthur

0

Các phương pháp này có được đặt tên theo các quy ước đặt tên đậu không? Tôi sẽ nói không.

Hãy thử setIdTag() và 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

Tôi đồng ý, điều đó tốt hơn. Nhưng nó không giải quyết được vấn đề của tôi. Tôi sẽ chỉnh sửa câu hỏi của tôi với các quy ước đặt tên phù hợp. – Arthur

Các vấn đề liên quan