简体   繁体   中英

PropertyAccessException: could not get a field value by reflection getter While using Hibernate

I have java class CourseOffered CourseTaker and Teacher where CourseTaker has Teacher 's and CourseOffered 's primary key as it's foreign key.

The CourseOffered Class Looks Following,( I have removed some basic constructors and Getters and Setters for make it small;)

package subHibernate.entity;

@Entity
@Table(name = "course_offered")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "CourseOffered.findAll", query = "SELECT c FROM CourseOffered c"),
    @NamedQuery(name = "CourseOffered.findByCourseId", query = "SELECT c FROM CourseOffered c WHERE c.courseId = :courseId"),
    @NamedQuery(name = "CourseOffered.findByCourseCode", query = "SELECT c FROM CourseOffered c WHERE c.courseCode = :courseCode"),
    @NamedQuery(name = "CourseOffered.findByCourseTitle", query = "SELECT c FROM CourseOffered c WHERE c.courseTitle = :courseTitle"),
    @NamedQuery(name = "CourseOffered.findBySession", query = "SELECT c FROM CourseOffered c WHERE c.session = :session"),
    @NamedQuery(name = "CourseOffered.findBySemester", query = "SELECT c FROM CourseOffered c WHERE c.semester = :semester")})
public class CourseOffered implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "course_id")
    private Integer courseId;
    @Basic(optional = false)
    @Column(name = "course_code")
    private String courseCode;
    @Basic(optional = false)
    @Column(name = "course_title")
    private String courseTitle;
    @Basic(optional = false)
    @Column(name = "session")
    private String session;
    @Basic(optional = false)
    @Column(name = "semester")
    private String semester;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "caCourseId")
    private List<CourseTaker> courseTakerList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "crCourseId")
    private List<CourseRegistration> courseRegistrationList;

    public CourseOffered() {
    }

    //Some Constructors
    // Getters and Setters which I deliberately Ignored as they are not 
    // Important here 

    @XmlTransient
    public List<CourseTaker> getCourseTakerList() {
        return courseTakerList;
    }

    public void setCourseTakerList(List<CourseTaker> courseTakerList) {
        this.courseTakerList = courseTakerList;
    }

    @XmlTransient
    public List<CourseRegistration> getCourseRegistrationList() {
        return courseRegistrationList;
    }

    public void setCourseRegistrationList(List<CourseRegistration> courseRegistrationList) {
        this.courseRegistrationList = courseRegistrationList;
    }

    public java.lang.Integer getPrimaryKey(){
        return getCourseId();
    }

}

And Teacher class looks like this,

@Entity
@Table(name = "teacher")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Teacher.findAll", query = "SELECT t FROM Teacher t"),
    @NamedQuery(name = "Teacher.findByTeacherId", query = "SELECT t FROM Teacher t WHERE t.teacherId = :teacherId"),
    @NamedQuery(name = "Teacher.findByTeaCode", query = "SELECT t FROM Teacher t WHERE t.teaCode = :teaCode"),
    @NamedQuery(name = "Teacher.findByTeaPassword", query = "SELECT t FROM Teacher t WHERE t.teaPassword = :teaPassword"),
    @NamedQuery(name = "Teacher.findByTeaName", query = "SELECT t FROM Teacher t WHERE t.teaName = :teaName"),
    @NamedQuery(name = "Teacher.findByTeaEmail", query = "SELECT t FROM Teacher t WHERE t.teaEmail = :teaEmail"),
    @NamedQuery(name = "Teacher.findByTeaDegignation", query = "SELECT t FROM Teacher t WHERE t.teaDegignation = :teaDegignation")})
public class Teacher implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "teacher_id")
    private Integer teacherId;
    @Basic(optional = false)
    @Column(name = "tea_code")
    private String teaCode;
    @Basic(optional = false)
    @Column(name = "tea_password")
    private String teaPassword;
    @Basic(optional = false)
    @Column(name = "tea_name")
    private String teaName;
    @Basic(optional = false)
    @Column(name = "tea_email")
    private String teaEmail;
    @Basic(optional = false)
    @Column(name = "tea_degignation")
    private String teaDegignation;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "caTeacherId")
    private List<CourseTaker> courseTakerList;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "tgTeacherId")
    private List<TeacherGroup> teacherGroupList;
    public Teacher() {
}

    // Some Constructors
    // Getters And Setters Ignored

    @XmlTransient
    public List<CourseTaker> getCourseTakerList() {
        return courseTakerList;
    }

    public void setCourseTakerList(List<CourseTaker> courseTakerList) {
        this.courseTakerList = courseTakerList;
    }

    @XmlTransient
    public List<TeacherGroup> getTeacherGroupList() {
        return teacherGroupList;
    }

    public void setTeacherGroupList(List<TeacherGroup> teacherGroupList) {
        this.teacherGroupList = teacherGroupList;
    }
}

And Finally CourseTaker Class

@Entity
@Table(name = "course_taker")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "CourseTaker.findAll", query = "SELECT c FROM CourseTaker c"),
    @NamedQuery(name = "CourseTaker.findByCourseTakerId", query = "SELECT c FROM   CourseTaker c WHERE c.courseTakerId = :courseTakerId")})
public class CourseTaker implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "course_taker_id")
    private Integer courseTakerId;
    @JoinColumn(name = "ca_course_id", referencedColumnName = "course_id")
    @ManyToOne(optional = false)
    private CourseOffered caCourseId;
    @JoinColumn(name = "ca_teacher_id", referencedColumnName = "teacher_id")
    @ManyToOne(optional = false)
    private Teacher caTeacherId;

    public CourseTaker() {
    }

    public CourseTaker(Integer courseTakerId) {
        this.courseTakerId = courseTakerId;
    }

    public Integer getCourseTakerId() {
        return courseTakerId;
    }

    public void setCourseTakerId(Integer courseTakerId) {
        this.courseTakerId = courseTakerId;
    }

    public CourseOffered getCaCourseId() {
        return caCourseId;
    }

    public void setCaCourseId(CourseOffered caCourseId) {
        this.caCourseId = caCourseId;
    }

    public Teacher getCaTeacherId() {
        return caTeacherId;
    }

    public void setCaTeacherId(Teacher caTeacherId) {
        this.caTeacherId = caTeacherId;
    }
}

I also Have a CourseTakerService Class which looks like this,

public class CourseTakerService implements ICourseTakerService ,   LocatableService {

    private static Logger log = LogService.getLogger(CourseTakerService.class);

    public void init() {
    }
    public void destroy() {
    }
       /**
    * Adds a new courseTaker to the database.
    *
    * @param model a data object
    * @return CourseTaker a data object with the primary key
    */
    public subHibernate.entity.CourseTaker   addCourseTaker(subHibernate.entity.CourseTaker model) throws GenericBusinessException {
    subHibernate.HibernateQueryHelper hibernateTemplate = new subHibernate.HibernateQueryHelper();
    try {
        hibernateTemplate.save(model);
        return getCourseTaker(model.getPrimaryKey());
    } finally {
        log.debug("finished addCourseTaker(subHibernate.entity.CourseTaker model)");
    }
    /**
    *
    * Retrieves a list of data object for the specified caTeacherId field. To
    * use a wildcard search, use a % in the query.
    *
    * @param caTeacherId the field
    * @return List of CourseTaker data objects, empty list in case no results
    * were found.
    */
    public java.util.List findCourseTakerByCaTeacherId(java.lang.Integer caTeacherId) throws GenericBusinessException {
    subHibernate.HibernateQueryHelper hibernateTemplate = new subHibernate.HibernateQueryHelper();
    try {
        String queryString = "from " + CourseTaker.class.getName() + " e where e.caTeacherId like :caTeacherId ";
        // Add a an order by on all primary keys to assure reproducable results.
        String orderByPart = "";
        orderByPart += " order by e.courseTakerId";
        queryString += orderByPart;
        Query query = hibernateTemplate.createQuery(queryString);
        hibernateTemplate.setQueryParameter(query, "caTeacherId", caTeacherId);
        List list = hibernateTemplate.list(query);
        return list;
        } finally {
            log.debug("finished findCourseTakerByCaTeacherId(java.lang.Integer caTeacherId)");
        }
    }
}

When I call list = (List) courseTakerService.findCourseTakerByCaTeacherId(1); It produces the following Stack Trace [It is Guaranteed that courseTaker table has a row with courseTeacherId = 1 ]

    27-Feb-2015 11:11:31.539 ERROR [http-nio-8084-exec-32]   com.finalist.util.log.JDKLogger.error Error while getting the hibernate query list.
    org.hibernate.PropertyAccessException: could not get a field value by  reflection getter of subHibernate.entity.Teacher.teacherId
    at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:62)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:344)
    at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4537)
    at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4259)
    at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:209)
at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:248)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:510)
at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:174)
at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:66)
at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:612)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1875)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1836)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1816)
at org.hibernate.loader.Loader.doQuery(Loader.java:900)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:342)
at org.hibernate.loader.Loader.doList(Loader.java:2526)
at org.hibernate.loader.Loader.doList(Loader.java:2512)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2342)
at org.hibernate.loader.Loader.list(Loader.java:2337)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:495)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:357)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1269)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
at subHibernate.HibernateQueryHelper.list(HibernateQueryHelper.java:94)
at subHibernate.session.CourseTakerService.findCourseTakerByCaTeacherId(CourseTakerService.java:270)
at OffiAssignServlet.processRequest(OffiAssignServlet.java:116)
at OffiAssignServlet.doPost(OffiAssignServlet.java:174)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:301)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:74)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1015)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1575)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1533)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Integer field subHibernate.entity.Teacher.teacherId to java.lang.Integer
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
at java.lang.reflect.Field.get(Field.java:387)
at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:59)
... 53 more

subHibernate.exception.GenericBusinessException: Error while getting the hibernate query list.
at subHibernate.HibernateQueryHelper.list(HibernateQueryHelper.java:98)
at subHibernate.session.CourseTakerService.findCourseTakerByCaTeacherId(CourseTakerService.java:270)
at OffiAssignServlet.processRequest(OffiAssignServlet.java:116)
at OffiAssignServlet.doPost(OffiAssignServlet.java:174)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:301)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:74)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1015)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1575)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1533)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of subHibernate.entity.Teacher.teacherId
at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:62)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:344)
at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4537)
at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4259)
at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:209)
at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:248)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:510)
at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:174)
at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:66)
at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:612)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1875)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1836)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1816)
at org.hibernate.loader.Loader.doQuery(Loader.java:900)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:342)
at org.hibernate.loader.Loader.doList(Loader.java:2526)
at org.hibernate.loader.Loader.doList(Loader.java:2512)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2342)
at org.hibernate.loader.Loader.list(Loader.java:2337)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:495)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:357)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1269)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
at subHibernate.HibernateQueryHelper.list(HibernateQueryHelper.java:94)
... 29 more
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Integer field subHibernate.entity.Teacher.teacherId to java.lang.Integer
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
at java.lang.reflect.Field.get(Field.java:387)
at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:59)
... 53 more

I think your query string need to be changed like below.Please try with this.

e.caTeacherId will refer to the Teacher object and ur comparing with the teacherId value.This might be the problem.

    String queryString = "from " + CourseTaker.class.getName() + " e where e.caTeacherId.teacherId like :caTeacherId ";

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM