@Test
  public void testPersistenceVariables()
      throws NamingException, NotSupportedException, SystemException, IllegalStateException,
          RollbackException, HeuristicMixedException, HeuristicRollbackException {
    MyEntity myEntity = new MyEntity("This is a test Entity with annotation in fields");
    MyEntityMethods myEntityMethods =
        new MyEntityMethods("This is a test Entity with annotations in methods");
    MyEntityOnlyFields myEntityOnlyFields =
        new MyEntityOnlyFields(
            "This is a test Entity with annotations in fields and without accesors methods");
    MyVariableSerializable myVariableSerializable =
        new MyVariableSerializable("This is a test SerializableObject");
    EntityManager em = ((EntityManagerFactory) ctx.getBean("myEmf")).createEntityManager();

    em.getTransaction().begin();
    em.persist(myEntity);
    em.persist(myEntityMethods);
    em.persist(myEntityOnlyFields);
    em.getTransaction().commit();
    em.close();

    log.info("---> get bean jpaSingleSessionCommandService");
    StatefulKnowledgeSession service =
        (StatefulKnowledgeSession) ctx.getBean("jpaSingleSessionCommandService");

    int sessionId = service.getId();
    log.info("---> created SingleSessionCommandService id: " + sessionId);

    log.info("### Starting process ###");
    Map<String, Object> parameters = new HashMap<String, Object>();
    parameters.put("x", "SomeString");
    parameters.put("y", myEntity);
    parameters.put("m", myEntityMethods);
    parameters.put("f", myEntityOnlyFields);
    parameters.put("z", myVariableSerializable);
    WorkflowProcessInstance processInstance =
        (WorkflowProcessInstance) service.startProcess("com.sample.ruleflow", parameters);
    log.info("Started process instance {}", processInstance.getId());

    TestWorkItemHandler handler = TestWorkItemHandler.getInstance();
    WorkItem workItem = handler.getWorkItem();
    assertNotNull(workItem);
    service.dispose();

    EntityManagerFactory emf = (EntityManagerFactory) ctx.getBean("myEmf");

    //        List< ? > result = emf.createEntityManager().createQuery( "select i from
    // VariableInstanceInfo i" ).getResultList();
    //        assertEquals( 5,
    //                      result.size() );
    log.info("### Retrieving process instance ###");

    /*        Environment env = KnowledgeBaseFactory.newEnvironment();
            env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
                     emf );
            env.set( EnvironmentName.TRANSACTION_MANAGER,
                     ctx.getBean( "txManager" ) );
            env.set( EnvironmentName.OBJECT_MARSHALLING_STRATEGIES,
                     new ObjectMarshallingStrategy[]{
                                                                      //  new JPAPlaceholderResolverStrategy(env),
                                                                      new SerializablePlaceholderResolverStrategy( ClassObjectMarshallingStrategyAcceptor.DEFAULT )
                                                                    } );
    */
    final Environment env = (Environment) ctx.getBean("env2");
    KnowledgeStoreService kstore = (KnowledgeStoreService) ctx.getBean("kstore1");
    KnowledgeBase kbase1 = (KnowledgeBase) ctx.getBean("kbase1");
    service = kstore.loadStatefulKnowledgeSession(sessionId, kbase1, null, env);

    processInstance = (WorkflowProcessInstance) service.getProcessInstance(processInstance.getId());
    assertNotNull(processInstance);

    assertNotNull(processInstance);
    assertEquals("SomeString", processInstance.getVariable("x"));
    assertEquals(
        "This is a test Entity with annotation in fields",
        ((MyEntity) processInstance.getVariable("y")).getTest());
    assertEquals(
        "This is a test Entity with annotations in methods",
        ((MyEntityMethods) processInstance.getVariable("m")).getTest());
    assertEquals(
        "This is a test Entity with annotations in fields and without accesors methods",
        ((MyEntityOnlyFields) processInstance.getVariable("f")).test);
    assertEquals(
        "This is a test SerializableObject",
        ((MyVariableSerializable) processInstance.getVariable("z")).getText());
    assertNull(processInstance.getVariable("a"));
    assertNull(processInstance.getVariable("b"));
    assertNull(processInstance.getVariable("c"));

    service.dispose();
  }
  @Test
  public void testTransactionsRollback() throws Exception {
    final List<?> list = new ArrayList<Object>();
    PlatformTransactionManager txManager = (PlatformTransactionManager) ctx.getBean("txManager");

    //        final Environment env = KnowledgeBaseFactory.newEnvironment();
    //        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,
    //                 ctx.getBean( "myEmf" ) );
    //        env.set( EnvironmentName.TRANSACTION_MANAGER,
    //                 txManager );
    //        env.set( EnvironmentName.GLOBALS,
    //                 new MapGlobalResolver() );
    //
    //        env.set( EnvironmentName.OBJECT_MARSHALLING_STRATEGIES,
    //                 new ObjectMarshallingStrategy[]{new JPAPlaceholderResolverStrategy( env ),
    //                                                                    new
    // SerializablePlaceholderResolverStrategy( ClassObjectMarshallingStrategyAcceptor.DEFAULT )} );
    final Environment env = (Environment) ctx.getBean("env");

    final KnowledgeStoreService kstore = (KnowledgeStoreService) ctx.getBean("kstore1");
    final KnowledgeBase kbRollback = (KnowledgeBase) ctx.getBean("kbRollback");

    TransactionTemplate txTemplate = new TransactionTemplate(txManager);
    final StatefulKnowledgeSession ksession =
        (StatefulKnowledgeSession)
            txTemplate.execute(
                new TransactionCallback() {

                  public Object doInTransaction(TransactionStatus status) {
                    StatefulKnowledgeSession kNewSession =
                        kstore.newStatefulKnowledgeSession(kbRollback, null, env);
                    kNewSession.setGlobal("list", list);
                    kNewSession.insert(1);
                    kNewSession.insert(2);
                    return kNewSession;
                  }
                });

    final int sessionId = ksession.getId();

    txTemplate = new TransactionTemplate(txManager);
    txTemplate.execute(
        new TransactionCallback() {

          public Object doInTransaction(TransactionStatus status) {
            ksession.insert(3);
            status.setRollbackOnly();
            return null;
          }
        });

    txTemplate = new TransactionTemplate(txManager);
    txTemplate.execute(
        new TransactionCallback() {

          public Object doInTransaction(TransactionStatus status) {
            ksession.fireAllRules();
            return null;
          }
        });

    assertEquals(2, list.size());

    txTemplate = new TransactionTemplate(txManager);
    txTemplate.execute(
        new TransactionCallback() {

          public Object doInTransaction(TransactionStatus status) {
            ksession.insert(3);
            ksession.insert(4);
            return null;
          }
        });

    txTemplate = new TransactionTemplate(txManager);
    txTemplate.execute(
        new TransactionCallback() {

          public Object doInTransaction(TransactionStatus status) {
            ksession.insert(5);
            ksession.insert(6);
            status.setRollbackOnly();
            return null;
          }
        });

    txTemplate = new TransactionTemplate(txManager);
    txTemplate.execute(
        new TransactionCallback() {

          public Object doInTransaction(TransactionStatus status) {
            ksession.fireAllRules();
            return null;
          }
        });

    assertEquals(4, list.size());

    ksession.dispose();

    // now load the ksession
    final StatefulKnowledgeSession ksession2 =
        JPAKnowledgeService.loadStatefulKnowledgeSession(sessionId, kbRollback, null, env);

    txTemplate = new TransactionTemplate(txManager);
    txTemplate.execute(
        new TransactionCallback() {

          public Object doInTransaction(TransactionStatus status) {
            ksession2.setGlobal("list", list);
            ksession2.insert(7);
            ksession2.insert(8);
            return null;
          }
        });

    txTemplate.execute(
        new TransactionCallback() {
          public Object doInTransaction(TransactionStatus status) {
            ksession2.fireAllRules();
            return null;
          }
        });

    assertEquals(6, list.size());
  }