Reputation: 351
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
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