Environment: Java 8, spring platform-bom-1.1.4-RELEASE, mysql 5.7
I have a problem when the transaction when saving an entity with self-referred one-to-many sub-entities.
Here is the entity:
public class ActivityEntity extends MDMBaseDescriptiveEntity {
@Column(name="project_id")
private Integer projectId;
@OneToMany(cascade={CascadeType.ALL}, fetch=FetchType.EAGER)
@JoinColumn(name="container_id", referencedColumnName="id")
@OrderColumn(name="order")
private List<ActivityEntity> activities = new ArrayList<ActivityEntity>();
@Enumerated(EnumType.STRING)
private Activity.Type type;
@Enumerated(EnumType.STRING)
private Activity.Mode mode;
private String tag;
...
}
Here is the repository:
@Transactional
public interface IActivityDao extends JpaRepository<ActivityEntity, Integer> {
}
Here is the service:
@Transactional
@Override
public Activity saveActivity(Activity activity)
{
Map<Activity, ActivityEntity> converted = ModelConverter.convert(activity);
ActivityEntity activityEntity = converted.get(activity);
activityDao.save(activityEntity);
List<ResourceDefinitionEntity> resourceEntities = new ArrayList<>();
for (Activity act : converted.keySet()) {
ActivityEntity entity = converted.get(act);
for (ResourceDefinition resource : act.getInputResources()) {
ResourceDefinitionEntity resourceEntity = ModelConverter.convert(resource);
resourceEntity.setScope(ResourceScope.ACTIVITY);
resourceEntity.setResourceOwnerId(entity.getId());
resourceEntities.add(resourceEntity);
}
for (ResourceDefinition resource : act.getOutputResources()) {
ResourceDefinitionEntity resourceEntity = ModelConverter.convert(resource);
resourceEntity.setScope(ResourceScope.ACTIVITY);
resourceEntity.setResourceOwnerId(entity.getId());
resourceEntity.setType(ResourceDefinition.Type.INSTANCE);
resourceEntities.add(resourceEntity);
}
}
if (!resourceEntities.isEmpty()) {
resourceDefinitionDao.save(resourceEntities);
}
return getActivity(activityEntity.getId());
}
Here is the dao test:
@Transactional
@Test
public void testSave() throws Exception {
ActivityEntity activity = setup();
printActivity(activity, 0);
activityDao.save(activity);
ActivityEntity retrieved = activityDao.findOne(activity.getId());
printActivity(retrieved, 0);
}
Here is the service test:
@Transactional
@Test
public void testSaveActivity() {
Activity container = TestDataProvider.activity();
Activity saved = activityService.saveActivity(container);
checkEquals(container, saved);
}
The service impl in deployed environment works fine when saving an activity without sub-activities; but fails on saving activities with sub-activities. The following is the log messages for the failure:
Hibernate: insert into activity (created_date, created_user_id, deleted_date, deleted_user_id, updated_date, updated_user_id, description, name, mode, project_id, script, tag, type) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into activity (created_date, created_user_id, deleted_date, deleted_user_id, updated_date, updated_user_id, description, name, mode, project_id, script, tag, type) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into activity (created_date, created_user_id, deleted_date, deleted_user_id, updated_date, updated_user_id, description, name, mode, project_id, script, tag, type) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into activity (created_date, created_user_id, deleted_date, deleted_user_id, updated_date, updated_user_id, description, name, mode, project_id, script, tag, type) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into activity (created_date, created_user_id, deleted_date, deleted_user_id, updated_date, updated_user_id, description, name, mode, project_id, script, tag, type) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into activity (created_date, created_user_id, deleted_date, deleted_user_id, updated_date, updated_user_id, description, name, mode, project_id, script, tag, type) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into resource_definition (created_date, created_user_id, deleted_date, deleted_user_id, updated_date, updated_user_id, description, name, mode, value, owner_id, scope, type) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into resource_definition (created_date, created_user_id, deleted_date, deleted_user_id, updated_date, updated_user_id, description, name, mode, value, owner_id, scope, type) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into resource_definition (created_date, created_user_id, deleted_date, deleted_user_id, updated_date, updated_user_id, description, name, mode, value, owner_id, scope, type) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into resource_definition (created_date, created_user_id, deleted_date, deleted_user_id, updated_date, updated_user_id, description, name, mode, value, owner_id, scope, type) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into resource_definition (created_date, created_user_id, deleted_date, deleted_user_id, updated_date, updated_user_id, description, name, mode, value, owner_id, scope, type) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into resource_definition (created_date, created_user_id, deleted_date, deleted_user_id, updated_date, updated_user_id, description, name, mode, value, owner_id, scope, type) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into resource_definition (created_date, created_user_id, deleted_date, deleted_user_id, updated_date, updated_user_id, description, name, mode, value, owner_id, scope, type) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into resource_definition (created_date, created_user_id, deleted_date, deleted_user_id, updated_date, updated_user_id, description, name, mode, value, owner_id, scope, type) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: select resourcede0_.id as id1_12_, resourcede0_.created_date as created_2_12_, resourcede0_.created_user_id as created_3_12_, resourcede0_.deleted_date as deleted_4_12_, resourcede0_.deleted_user_id as deleted_5_12_, resourcede0_.updated_date as updated_6_12_, resourcede0_.updated_user_id as updated_7_12_, resourcede0_.description as descript8_12_, resourcede0_.name as name9_12_, resourcede0_.mode as mode10_12_, resourcede0_.value as value11_12_, resourcede0_.owner_id as owner_i12_12_, resourcede0_.scope as scope13_12_, resourcede0_.type as type14_12_ from resource_definition resourcede0_ where resourcede0_.owner_id=? and resourcede0_.scope=? and resourcede0_.mode=?
Hibernate: select resourcede0_.id as id1_12_, resourcede0_.created_date as created_2_12_, resourcede0_.created_user_id as created_3_12_, resourcede0_.deleted_date as deleted_4_12_, resourcede0_.deleted_user_id as deleted_5_12_, resourcede0_.updated_date as updated_6_12_, resourcede0_.updated_user_id as updated_7_12_, resourcede0_.description as descript8_12_, resourcede0_.name as name9_12_, resourcede0_.mode as mode10_12_, resourcede0_.value as value11_12_, resourcede0_.owner_id as owner_i12_12_, resourcede0_.scope as scope13_12_, resourcede0_.type as type14_12_ from resource_definition resourcede0_ where resourcede0_.owner_id=? and resourcede0_.scope=? and resourcede0_.mode=?
Hibernate: select resourcede0_.id as id1_12_, resourcede0_.created_date as created_2_12_, resourcede0_.created_user_id as created_3_12_, resourcede0_.deleted_date as deleted_4_12_, resourcede0_.deleted_user_id as deleted_5_12_, resourcede0_.updated_date as updated_6_12_, resourcede0_.updated_user_id as updated_7_12_, resourcede0_.description as descript8_12_, resourcede0_.name as name9_12_, resourcede0_.mode as mode10_12_, resourcede0_.value as value11_12_, resourcede0_.owner_id as owner_i12_12_, resourcede0_.scope as scope13_12_, resourcede0_.type as type14_12_ from resource_definition resourcede0_ where resourcede0_.owner_id=? and resourcede0_.scope=? and resourcede0_.mode=?
Hibernate: select resourcede0_.id as id1_12_, resourcede0_.created_date as created_2_12_, resourcede0_.created_user_id as created_3_12_, resourcede0_.deleted_date as deleted_4_12_, resourcede0_.deleted_user_id as deleted_5_12_, resourcede0_.updated_date as updated_6_12_, resourcede0_.updated_user_id as updated_7_12_, resourcede0_.description as descript8_12_, resourcede0_.name as name9_12_, resourcede0_.mode as mode10_12_, resourcede0_.value as value11_12_, resourcede0_.owner_id as owner_i12_12_, resourcede0_.scope as scope13_12_, resourcede0_.type as type14_12_ from resource_definition resourcede0_ where resourcede0_.owner_id=? and resourcede0_.scope=? and resourcede0_.mode=?
Hibernate: select resourcede0_.id as id1_12_, resourcede0_.created_date as created_2_12_, resourcede0_.created_user_id as created_3_12_, resourcede0_.deleted_date as deleted_4_12_, resourcede0_.deleted_user_id as deleted_5_12_, resourcede0_.updated_date as updated_6_12_, resourcede0_.updated_user_id as updated_7_12_, resourcede0_.description as descript8_12_, resourcede0_.name as name9_12_, resourcede0_.mode as mode10_12_, resourcede0_.value as value11_12_, resourcede0_.owner_id as owner_i12_12_, resourcede0_.scope as scope13_12_, resourcede0_.type as type14_12_ from resource_definition resourcede0_ where resourcede0_.owner_id=? and resourcede0_.scope=? and resourcede0_.mode=?
Hibernate: select resourcede0_.id as id1_12_, resourcede0_.created_date as created_2_12_, resourcede0_.created_user_id as created_3_12_, resourcede0_.deleted_date as deleted_4_12_, resourcede0_.deleted_user_id as deleted_5_12_, resourcede0_.updated_date as updated_6_12_, resourcede0_.updated_user_id as updated_7_12_, resourcede0_.description as descript8_12_, resourcede0_.name as name9_12_, resourcede0_.mode as mode10_12_, resourcede0_.value as value11_12_, resourcede0_.owner_id as owner_i12_12_, resourcede0_.scope as scope13_12_, resourcede0_.type as type14_12_ from resource_definition resourcede0_ where resourcede0_.owner_id=? and resourcede0_.scope=? and resourcede0_.mode=?
Hibernate: select resourcede0_.id as id1_12_, resourcede0_.created_date as created_2_12_, resourcede0_.created_user_id as created_3_12_, resourcede0_.deleted_date as deleted_4_12_, resourcede0_.deleted_user_id as deleted_5_12_, resourcede0_.updated_date as updated_6_12_, resourcede0_.updated_user_id as updated_7_12_, resourcede0_.description as descript8_12_, resourcede0_.name as name9_12_, resourcede0_.mode as mode10_12_, resourcede0_.value as value11_12_, resourcede0_.owner_id as owner_i12_12_, resourcede0_.scope as scope13_12_, resourcede0_.type as type14_12_ from resource_definition resourcede0_ where resourcede0_.owner_id=? and resourcede0_.scope=? and resourcede0_.mode=?
Hibernate: select resourcede0_.id as id1_12_, resourcede0_.created_date as created_2_12_, resourcede0_.created_user_id as created_3_12_, resourcede0_.deleted_date as deleted_4_12_, resourcede0_.deleted_user_id as deleted_5_12_, resourcede0_.updated_date as updated_6_12_, resourcede0_.updated_user_id as updated_7_12_, resourcede0_.description as descript8_12_, resourcede0_.name as name9_12_, resourcede0_.mode as mode10_12_, resourcede0_.value as value11_12_, resourcede0_.owner_id as owner_i12_12_, resourcede0_.scope as scope13_12_, resourcede0_.type as type14_12_ from resource_definition resourcede0_ where resourcede0_.owner_id=? and resourcede0_.scope=? and resourcede0_.mode=?
Hibernate: select resourcede0_.id as id1_12_, resourcede0_.created_date as created_2_12_, resourcede0_.created_user_id as created_3_12_, resourcede0_.deleted_date as deleted_4_12_, resourcede0_.deleted_user_id as deleted_5_12_, resourcede0_.updated_date as updated_6_12_, resourcede0_.updated_user_id as updated_7_12_, resourcede0_.description as descript8_12_, resourcede0_.name as name9_12_, resourcede0_.mode as mode10_12_, resourcede0_.value as value11_12_, resourcede0_.owner_id as owner_i12_12_, resourcede0_.scope as scope13_12_, resourcede0_.type as type14_12_ from resource_definition resourcede0_ where resourcede0_.owner_id=? and resourcede0_.scope=? and resourcede0_.mode=?
Hibernate: select resourcede0_.id as id1_12_, resourcede0_.created_date as created_2_12_, resourcede0_.created_user_id as created_3_12_, resourcede0_.deleted_date as deleted_4_12_, resourcede0_.deleted_user_id as deleted_5_12_, resourcede0_.updated_date as updated_6_12_, resourcede0_.updated_user_id as updated_7_12_, resourcede0_.description as descript8_12_, resourcede0_.name as name9_12_, resourcede0_.mode as mode10_12_, resourcede0_.value as value11_12_, resourcede0_.owner_id as owner_i12_12_, resourcede0_.scope as scope13_12_, resourcede0_.type as type14_12_ from resource_definition resourcede0_ where resourcede0_.owner_id=? and resourcede0_.scope=? and resourcede0_.mode=?
Hibernate: select resourcede0_.id as id1_12_, resourcede0_.created_date as created_2_12_, resourcede0_.created_user_id as created_3_12_, resourcede0_.deleted_date as deleted_4_12_, resourcede0_.deleted_user_id as deleted_5_12_, resourcede0_.updated_date as updated_6_12_, resourcede0_.updated_user_id as updated_7_12_, resourcede0_.description as descript8_12_, resourcede0_.name as name9_12_, resourcede0_.mode as mode10_12_, resourcede0_.value as value11_12_, resourcede0_.owner_id as owner_i12_12_, resourcede0_.scope as scope13_12_, resourcede0_.type as type14_12_ from resource_definition resourcede0_ where resourcede0_.owner_id=? and resourcede0_.scope=? and resourcede0_.mode=?
Hibernate: select resourcede0_.id as id1_12_, resourcede0_.created_date as created_2_12_, resourcede0_.created_user_id as created_3_12_, resourcede0_.deleted_date as deleted_4_12_, resourcede0_.deleted_user_id as deleted_5_12_, resourcede0_.updated_date as updated_6_12_, resourcede0_.updated_user_id as updated_7_12_, resourcede0_.description as descript8_12_, resourcede0_.name as name9_12_, resourcede0_.mode as mode10_12_, resourcede0_.value as value11_12_, resourcede0_.owner_id as owner_i12_12_, resourcede0_.scope as scope13_12_, resourcede0_.type as type14_12_ from resource_definition resourcede0_ where resourcede0_.owner_id=? and resourcede0_.scope=? and resourcede0_.mode=?
Hibernate: update activity set container_id=?, order=? where id=?
2015-11-26 16:07:55,331 [main] WARN o.h.e.j.s.SqlExceptionHelper - SQL Error: 1064, SQLState: 42000
2015-11-26 16:07:55,333 [main] ERROR o.h.e.j.s.SqlExceptionHelper - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order=0 where id=707' at line 1
2015-11-26 16:07:55,335 [main] WARN o.h.e.j.s.SqlExceptionHelper - SQL Warning Code: 1064, SQLState: 42000
2015-11-26 16:07:55,336 [main] WARN o.h.e.j.s.SqlExceptionHelper - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order=0 where id=707' at line 1
So I go back to the service test, the test works fine if I have the @Transactional annotation on the test method testSaveActivity(). If I remove the @Transactional annotation from the test method, the test fails with the same error as shown above. I've tried to add the @Transactional annotation with different parameters to the service method, it does not help at all; tried to add @Transational annotation to controller method as well, no use.
The annotation works on the test method is a mystery to me. Do not understand why it does not work on other places.
The following the stack trace to the failing point.