I'm not sure this should be comitted to the trunk.
 
Users can't use this code as is, because:
 
1. Manual/Automatic flush
   - they'd need to implement flush() and persist() if they have manual flush set up.
2. HibUtil
   - is a system specific implementation used to manage SessionFactory and Sessions
   - systems using Hibernate will already have some version of this they will need to leverage
 
so this is more of a template. 
 
In fact, it won't compile without a HibUtil, so that's another problem for adding it to the trunk...
 
A test case in examples would let us create a simple HibUtil and hibernate.cfg.xml.

The test case could create a H2 DB and the tables needed...
 


From: Mauricio Salatino <salaboy@gmail.com>
To: Rules Users List <rules-users@lists.jboss.org>
Sent: Fri, October 23, 2009 4:18:16 PM
Subject: Re: [rules-users] [droolsflow] - one way to use Hibernate mapping with JPAVariablePersister

nice.. do you mind if I commit it to the trunk?
can you create some unit testing too?


On Fri, Oct 23, 2009 at 3:27 PM, Bill Tarr <javatestcase@yahoo.com> wrote:
Here is an alternate version of JPAVariablePersister for people who are already using Hibernate xml mapping files. 

This implementation has some downsides, but it seems to be working for now.

I am going to keep using JPA to manage all the Drools Flow tables.

My domain object persistence will be managed by Hibernate Session. 

We are also currently using automatic flush (so no code to persist domain objects in this class)

Obviously you need to use your own version of HibUtil.

import java.util.logging.Level;
import java.util.logging.Logger;
import org.drools.persistence.processinstance.variabletypes.JPAPersistedVariable;
import org.drools.persistence.processinstance.variabletypes.VariableInstanceInfo;
import org.drools.persistence.processinstance.persisters.VariablePersister;
import org.drools.runtime.Environment;
import org.hibernate.Session;
import HibUtil;
/**
 * Variation on Drools JPA Variable Persister.
 * org.drools.persistence.processinstance.persisters.JPAVariablePersister
 * for using variables persisted by Hibernate, while still using JPA to
 * persist DroolsFlow data.
 *
 * @author <a href="mailto:kris_verlaenen@hotmail.com">Kris Verlaenen</a>
 * @author salaboy
 */
public class JPAVariablePersisterHibernate implements VariablePersister {
 public VariableInstanceInfo persistExternalVariable(String name, Object o,
   VariableInstanceInfo oldValue, Environment env) {
                if(o == null || (oldValue != null && oldValue.getPersister().equals(""))){
                    return null;
                }
  try {
   JPAPersistedVariable result = null;
   if (oldValue instanceof JPAPersistedVariable) {
    result = (JPAPersistedVariable) oldValue;
   }
   if (result == null) {
    result = new JPAPersistedVariable();
   }
   Long idValue = geHibIdValue(o);
   result.setPersister(this.getClass().getName());
            result.setName(name);
   result.setEntityId(idValue);
   result.setEntity(o);
   result.setEntityClass(o.getClass().getCanonicalName());
            return result;
  } catch (Throwable t) {
   Logger.getLogger(JPAVariablePersisterHibernate.class.getName())
    .log(Level.SEVERE, null, t);
   throw new RuntimeException("Could not persist external variable", t);
  }
 }
 public Object getExternalPersistedVariable(
   VariableInstanceInfo variableInstanceInfo, Environment env) {
        if(((JPAPersistedVariable) variableInstanceInfo) == null || ((JPAPersistedVariable) variableInstanceInfo).getEntityId() == null){
            return null;
        }
        System.out.println("Restoring JPAPersistedVariable id=" + ((JPAPersistedVariable) variableInstanceInfo).getId() + " entityId=" + ((JPAPersistedVariable) variableInstanceInfo).getEntityId() + " class=" + ((JPAPersistedVariable) variableInstanceInfo).getEntityClass() + " value=" + ((JPAPersistedVariable) variableInstanceInfo).getEntity());
  String varType = ((JPAPersistedVariable) variableInstanceInfo).getEntityClass();
       
        Object obj = HibUtil.getCurrentSession().get(varType, ((JPAPersistedVariable) variableInstanceInfo).getEntityId());
        HibUtil.closeCurrentSession();
        return obj;
 }
/**
 * Hibernate lookup to get ID column.
 * @param o Dto to look up.
 * @return Long id.
 */
 private Long geHibIdValue(Object o)  {
        Session session = HibUtil.getCurrentSession();
        return (Long) session.getIdentifier(o);
 }





_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users



--
- http://salaboy.wordpress.com
- http://www.jbug.com.ar
- Salatino "Salaboy" Mauricio -