Hello,
I am trying to write a test class that will insert data in the database. I am using mysql and xdoclet to generate the hibernate mapping. My test class is supposed to insert data in 2 tables: prescription and medicine. These two tables have a many-to-many relationship between them. The code for my test class is as follows:
public class TestPrescription {
private static SessionFactory sf;
public static void configure() throws HibernateException{
sf = new Configuration()
.addClass(com.smarthealth.model.Prescription.class)
.addClass(com.smarthealth.model.Medicine.class)
.buildSessionFactory();
}
public static void main(String [] args){
try{
configure();
Session session = sf.openSession();
Transaction t = session.beginTransaction();
System.out.println("MANY-TO-MANY MAPPING");
Set set = new HashSet();
Medicine m = new Medicine();
m.setDosage("dosage");
m.setDuration("duration");
m.setName("name");
m.setStrength("strength");
m.setType("type");
session.save(m);
set.add(m);
Prescription p = new Prescription();
p.setDate(new Date());
p.setStatus("bought");
p.setMedicines(set);
session.save(p);
t.commit();
session.close();
// Re-load
session = sf.openSession();
t = session.beginTransaction();
p = (Prescription) session.load(Prescription.class, p.getId());
System.out.println("Prescription: " + p.getMedicines());
t.commit();
session.close();
}
catch(HibernateException he){
he.printStackTrace();
}
}
}
When I run my test class, I get the following error message:
(util.JDBCExceptionReporter 57 ) SQL Error: 1216, SQLState: 23000
(util.JDBCExceptionReporter 58 ) Cannot add or update a child row: a foreign key constraint fails
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.ErrorCodeConverter.convert(ErrorCodeConverter.java:74)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:179)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:226)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:136)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:678)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:309)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:86)
at com.smarthealth.test.Example.main(Unknown Source)
Caused by: java.sql.BatchUpdateException: Cannot add or update a child row: a foreign key constraint fails
at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:822)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:57)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:172)
... 8 more
(def.AbstractFlushingEventListener 277 ) Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.ErrorCodeConverter.convert(ErrorCodeConverter.java:74)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:179)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:226)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:136)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:678)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:309)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:86)
at com.smarthealth.test.Example.main(Unknown Source)
Caused by: java.sql.BatchUpdateException: Cannot add or update a child row: a foreign key constraint fails
at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:822)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:57)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:172)
... 8 more
I read in other forums that the problem might be caused by the id generator being a primitive type (int or long). My id generator is "uuid.hex".
I would be grateful if anyone could help.
Thanks in advance.
|