Hi
Hibernate newbie here. I am using Hibernate + Spring + MySQL.
I have an entity (ScheduleData) that has a list of entities (JobParameter class). When Hibernate inserts the JobParameter data into the database, it does not generate a value for the primary key (The primary key has @Id and @GeneratedValue) and does not set a value for the foreign key.
This mapping annotation retrieves the data from the database without any problems.
It encounters the following exception:
Code:
xception in thread "main" org.springframework.dao.InvalidDataAccessResourceUsageException: could not insert: [com.yahoo.sm.qatools.ax247.scheduler.JobParameter]; nested exception is org.hibernate.exception.SQLGrammarException: could not insert: [com.yahoo.sm.qatools.ax247.scheduler.JobParameter]
Caused by: org.hibernate.exception.SQLGrammarException: could not insert: [com.yahoo.sm.qatools.ax247.scheduler.JobParameter]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:40)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2158)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2638)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:48)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:298)
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.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:94)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
at org.hibernate.engine.CascadingAction$1.cascade(CascadingAction.java:218)
at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296)
at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:456)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:334)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121)
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:635)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372)
at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:632)
at com.yahoo.sm.qatools.ax247.scheduler.ScheduleDataDAOImpl.addToSchedule(ScheduleDataDAOImpl.java:35)
at com.yahoo.sm.qatools.ax247.scheduler.ScheduleDataDAOImpl.main(ScheduleDataDAOImpl.java:23)
Caused by: java.sql.SQLException: No value specified for parameter 4
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:1674)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1512)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1455)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1440)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:102)
at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:73)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:33)
... 39 more
There is my code:
Code:
ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(new String[] {"spring.xml"});
CronSchedule cronSchedule = new CronSchedule("10", "20", "5", "15", "7", "5", "2007");
List<JobParameter> jobParameters = new Vector<JobParameter>();
jobParameters.add(new JobParameter("job2-1", "job2-value1"));
jobParameters.add(new JobParameter("job2-2", "job2-value2"));
Job job = new Job(27);
ScheduleData scheduleData = new ScheduleData(true, job, cronSchedule, jobParameters);
ScheduleDataDAOImpl dao = (ScheduleDataDAOImpl) appContext.getBean("scheduleDAO");
getHibernateTemplate().save(scheduleData);
Code:
@Entity
@org.hibernate.annotations.Entity(dynamicUpdate = true)
@Table(name="scheduler")
public class ScheduleData implements Serializable {
@Id
private long id;
@Column(name="scm_checkout")
private boolean checkoutFromSourceControl;
@ManyToOne(cascade={CascadeType.REFRESH})
@JoinColumn(name="job_id")
private Job job;
@Embedded
private CronSchedule cronSchedule;
@OneToMany(fetch=FetchType.EAGER, cascade={CascadeType.ALL})
@JoinColumn(name="scheduler_id", referencedColumnName="id")
private List<JobParameter> jobParameters;
// removed getter & setters
}
Code:
@Entity
@org.hibernate.annotations.Entity(dynamicUpdate = true)
@Table(name="scheduler_job_parameters")
public class JobParameter implements Serializable {
@Id
@GeneratedValue
private long id;
@Column(name="scheduler_id", nullable=false)
private int schedulerId;
@Column
private String name;
@Column
private String value;
public JobParameter() { }
public JobParameter(String name, String value) {
this.name = name;
this.value = value;
}
// removed getters & setters
}
Code:
CREATE TABLE scheduler (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
job_id INT UNSIGNED NOT NULL,
scm_checkout ENUM('True', 'False'),
seconds VARCHAR(30),
minutes VARCHAR(30),
hours VARCHAR(30),
day_of_month VARCHAR(30),
month VARCHAR(30),
day_of_week VARCHAR(30),
year VARCHAR(30),
PRIMARY KEY (id),
FOREIGN KEY (job_id) REFERENCES job(id) ON DELETE CASCADE
) TYPE=INNODB DEFAULT CHARSET=utf8;
CREATE TABLE scheduler_job_parameters (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
scheduler_id INT UNSIGNED NOT NULL,
name VARCHAR(100) NOT NULL,
value text,
PRIMARY KEY (id),
FOREIGN KEY (scheduler_id) REFERENCES scheduler(id) ON DELETE CASCADE
) TYPE=INNODB DEFAULT CHARSET=utf8;