0

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.

enter image description here

H.Sheng
  • 171
  • 3
  • 12
  • Order is a SQL reserved word so possibly caused by the fact you have a column named 'order'. See: http://stackoverflow.com/questions/3364835/automatic-reserved-word-escaping-for-hibernate-tables-and-columns – Alan Hay Nov 27 '15 at 08:58
  • @Alan Hay Thanks for the link. I changed the column name to 'exec_seq' and everything works fine now. – H.Sheng Nov 27 '15 at 14:24

0 Answers0