Eli Johnes
Eli Johnes

Reputation: 351

Illegal argument exception:occurred calling getter of id

I am trying to insert a record in the database. For the first time it gets inserted properly. But for the second time if I am inserting the record with some updated field details with a different Id, it is throwing

data access exception:illegal argument exception: occurred calling getter of id

I am not able to figure out the reason for this.

This is the stack trace:-

com.abc.dac.exception.DataAccessException: org.springframework.orm.hibernate3.HibernateSystemException: IllegalArgumentException occurred calling getter of com.abc.dac.domain.ActivityLog.id; nested exception is org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of com.abc.dac.domain.ActivityLog.id
        at com.abc.dac.hours.dao.impl.ActivityLogDAOImpl.insertRecord(ActivityLogDAOImpl.java:39)
        at com.abc.dac.hours.service.impl.HoursServiceImpl.insertmethod(HoursServiceImpl.java:2850)
        at com.abc.dac.hours.service.impl.HoursServiceImpl.updateReviewTrack(HoursServiceImpl.java:1186)
        at com.abc.dac.hours.web.HoursController.updateReviewStatus(HoursController.java:1741)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
        at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)
        at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at com.abc.dac.AuthorizationFilter.doFilter(AuthorizationFilter.java:35)
        at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
        at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at com.abc.dac.AuthorizationFilter.doFilter(AuthorizationFilter.java:35)
        at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
        at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:563)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
        at java.lang.Thread.run(Unknown Source)
    Caused by: org.springframework.orm.hibernate3.HibernateSystemException: IllegalArgumentException occurred calling getter of com.abc.dac.domain.ActivityLog.id; nested exception is org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of com.abc.dac.domain.ActivityLog.id
        at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:679)
        at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
        at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
        at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
        at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:683)
        at com.abc.dac.hours.dao.impl.ActivityLogDAOImpl.insertRecord(ActivityLogDAOImpl.java:33)
        ... 39 more
    Caused by: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of com.abc.dac.domain.ActivityLog.id
        at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:171)
        at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:183)
        at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3589)
        at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3305)
        at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:181)
        at org.hibernate.engine.ForeignKeys$Nullifier.isNullifiable(ForeignKeys.java:137)
        at org.hibernate.engine.ForeignKeys$Nullifier.nullifyTransientReferences(ForeignKeys.java:69)
        at org.hibernate.engine.ForeignKeys$Nullifier.nullifyTransientReferences(ForeignKeys.java:47)
        at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:288)
        at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
        at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
        at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
        at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
        at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
        at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
        at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
        at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:686)
        at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:1)
        at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
        ... 42 more
    Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:145)
        ... 63 more

The POJO class is:-

@Entity(name = "activitylog")
@Table(name = "activitylog")
public class ActivityLog {

private Integer id;
private Integer employeeId;
private String firstname;
private String lastname;
private Date submissiondate = null;
private Employee manager = null;
private Date reviewdate = null;
private String activity=null;
private Short month;
private Short year;


/**
 * @return id
 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "Id",unique = true, nullable = false)
public Integer getId() {
    return id;
}

/**
 * @param id
 */
public void setId(Integer id) {
    this.id = id;
}





@Column(name="employeeId", nullable=false)
public Integer getEmployeeId() {
    return employeeId;
}
public void setEmployeeId(Integer employeeId) {
    this.employeeId = employeeId;
}
@Column(name = "firstname", nullable = false, length = 45)
public String getFirstName() {
    return firstname;
}
public void setFirstName(String firstName) {
    this.firstname = firstName;
}

@Column(name = "lastname", nullable = false, length = 45)
public String getLastName() {
    return lastname;
}
public void setLastName(String lastName) {
    this.lastname = lastName;
}
@Temporal(TemporalType.DATE)
@Column(name = "submissiondate")
public Date getSubmissiondate() {
    return submissiondate;
}
public void setSubmissiondate(Date submissiondate) {
    this.submissiondate = submissiondate;
}
@ManyToOne(fetch = FetchType.EAGER, optional = true, targetEntity = ActivityLog.class)
@JoinColumn(name = "manager")
public Employee getManager() {
    return manager;
}
public void setManager(Employee manager) {
    this.manager = manager;
}
@Temporal(TemporalType.DATE)
@Column(name = "reviewdate")
public Date getReviewdate() {
    return reviewdate;
}
public void setReviewdate(Date reviewdate) {
    this.reviewdate = reviewdate;
}
@Column(name = "activity", nullable = false, length = 345)
public String getActivity() {
    return activity;
}
public void setActivity(String activity) {
    this.activity = activity;
}
@Column(name = "month", nullable = false)
public Short getMonth() {
    return month;
}
public void setMonth(Short month) {
    this.month = month;
}
@Column(name = "year", nullable = false)
public Short getYear() {
    return year;
}
public void setYear(Short year) {
    this.year = year;
}


}

The insert method invocation is happening in two places. The first one is:-

if(activityLog ==null){
            activityLog = new ActivityLog();
            activityLog.setEmployeeId(loggedInUser.getId());
            activityLog.setFirstName(loggedInUser.getFirstName());
            activityLog.setLastName(loggedInUser.getLastName());
            activityLog.setSubmissiondate(DLCUtils.getCurrentDate()); 
            activityLog.setMonth(currentMonth);
            activityLog.setYear(currentYear);
            activityLog.setActivity("Timesheet is submitted for the month of"+" "+DLCUtils.getMonthName(currentMonth)+" "+currentYear);
            //activityLog.setManager(loggedInUser.getManager());
            //activityLog.setReviewdate(reviewdate);*/
            insertmethod(activityLog);
            //m_activityLogDao.insertRecord(activityLog);
            }

The above insertion is happening fine as it is the first time.Below is the second time I am invoking theh insertmethod to add another record with some fields changed and with a new Id. But it gets failed here.

activityLog=m_activityLogDao.getRecord(employee.getId() ,new Integer(
                year).shortValue(), new Integer(month).shortValue());
        activityLog1 = new ActivityLog();
        activityLog1.setManager(employee.getManager());
        activityLog1.setReviewdate(DLCUtils.getCurrentDate());
        System.out.println("latest1");
        activityLog1.setEmployeeId(employee.getId());

        activityLog1.setFirstName(activityLog.getFirstName());
        activityLog1.setLastName(activityLog.getLastName());
        activityLog1.setSubmissiondate(activityLog.getSubmissiondate());
        activityLog1.setMonth(activityLog.getMonth());
        activityLog1.setYear(activityLog.getYear());
        activityLog1.setActivity(activityLog.getActivity());
//      activityLog1.setId(5);

        if (action.equals(StringConstants.ACCEPT_EMPLOYEE_HOURS)) {

            reviewTrack.setStatus(1);
            m_reviewTrackDao.updateRecord(reviewTrack);
            activityLog1.setActivity("Time sheet"+"for "+DLCUtils.getMonthName(month)+" "+year+ " is accepted by"+" "+employee.getManager().getFullName());
            insertmethod(activityLog1);
}
public void insertmethod(ActivityLog activitylog){
        try {
            m_activityLogDao.insertRecord(activitylog);
        } catch (DataAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

Below is the insertrecord method's implementation:-

 @Override
    public void insertRecord(ActivityLog activityLog) throws DataAccessException
    {
        try
        {

            hibernateTemplate.save(activityLog);
           // hibernateTemplate.flush();
        }
        catch(Exception e)
        {
            m_logger.error("Error in inserting record in activity_Log table", e);
            throw new DataAccessException(e);
        }

    }

The code is throwing exception when it is executing the hibernateTemplate.save(activityLog) statement.

Upvotes: 2

Views: 4988

Answers (1)

Tobias Liefke
Tobias Liefke

Reputation: 9022

The error is the declaration of getManager():

@ManyToOne(fetch = FetchType.EAGER, optional = true, targetEntity = ActivityLog.class)
@JoinColumn(name = "manager")
public Employee getManager() {
    return manager;
}

You don't need to specify targetEntity as long as Hibernate is able to infer that by itself. In the case here it is quite obvious that it is Employee. And as you have given a target entity class which is not a subclass of Employee, it throws the mentioned exception when trying to cast Employee to ActivityLog.

Remove targentEntity and you are fine.

Upvotes: 1

Related Questions