2012-09-25 55 views
0

我想在Objectify4的功能利用然而我的應用程序是建立並正在與版本3.我的應用程序在很大程度上建立在ObjectifyGenericDao模式,而且Objectify4設計模式是從這個非常不同:ObjectifyGenericDao <T>與Objectify4

ObjectifyGenericDao.java

public class ObjectifyGenericDao<T> extends DAOBase 
{ 

    static final int BAD_MODIFIERS = Modifier.FINAL | Modifier.STATIC | Modifier.TRANSIENT; 

    static 
    { 
     // Register all your entity classes here 
    } 

    protected Class<T> clazz; 

    /** 
    * We've got to get the associated domain class somehow 
    * 
    * @param clazz 
    */ 
    protected ObjectifyGenericDao(Class<T> clazz) 
    { 
     this.clazz = clazz; 
    } 

    public ObjectifyGenericDao(ObjectifyOpts opts) { 
     super(opts); 
     //this.clazz = clazz; 
    } 

    public Key<T> put(T entity) 
    { 
     return ofy().put(entity); 
    } 

    // TODO This code was modified 
    // and need to be tested 
    public List<Key<T>> putAll(Iterable<T> entities) 
    { 
     Map<Key<T>, T> map = ofy().put(entities); 
     return new ArrayList<Key<T>>(map.keySet()); 
     //return ofy().put(entities); 
    } 

    public void delete(T entity) 
    { 
     ofy().delete(entity); 
    } 

    public void deleteKey(Key<T> entityKey) 
    { 
     ofy().delete(entityKey); 
    } 

    public void deleteAll(Iterable<T> entities) 
    { 
     ofy().delete(entities); 
    } 

    public void deleteKeys(Iterable<Key<T>> keys) 
    { 
     ofy().delete(keys); 
    } 

    public T get(Long id) throws EntityNotFoundException 
    { 
     return ofy().get(this.clazz, id); 
    } 

    public T get(String id) throws EntityNotFoundException 
    { 
     return ofy().get(this.clazz, id); 
    } 

    public T get(Key<T> key) throws EntityNotFoundException 
    { 
     return ofy().get(key); 
    } 

    /** 
    * Convenience method to get all objects matching a single property 
    * 
    * @param propName 
    * @param propValue 
    * @return T matching Object 
    */ 
    public T getByProperty(String propName, Object propValue) 
    { 
     Query<T> q = ofy().query(clazz); 
     q.filter(propName, propValue); 
     return q.get(); 
    } 

    public List<T> listByProperty(String propName, Object propValue) 
    { 
     Query<T> q = ofy().query(clazz); 
     q.filter(propName, propValue); 
     return asList(q.fetch()); 
    } 

    public List<Key<T>> listKeysByProperty(String propName, Object propValue) 
    { 
     Query<T> q = ofy().query(clazz); 
     q.filter(propName, propValue); 
     return asKeyList(q.fetchKeys()); 
    } 

    public T getByExample(T exampleObj) 
    { 
     Query<T> queryByExample = buildQueryByExample(exampleObj); 
     Iterable<T> iterableResults = queryByExample.fetch(); 
     Iterator<T> i = iterableResults.iterator(); 
     T obj = i.next(); 
     if (i.hasNext()) 
      throw new RuntimeException("Too many results"); 
     return obj; 
    } 

    public List<T> listByExample(T exampleObj) 
    { 
     Query<T> queryByExample = buildQueryByExample(exampleObj); 
     return asList(queryByExample.fetch()); 
    } 

    private List<T> asList(Iterable<T> iterable) 
    { 
     ArrayList<T> list = new ArrayList<T>(); 
     for (T t : iterable) 
     { 
      list.add(t); 
     } 
     return list; 
    } 

    private List<Key<T>> asKeyList(Iterable<Key<T>> iterableKeys) 
    { 
     ArrayList<Key<T>> keys = new ArrayList<Key<T>>(); 
     for (Key<T> key : iterableKeys) 
     { 
      keys.add(key); 
     } 
     return keys; 
    } 

    private Query<T> buildQueryByExample(T exampleObj) 
    { 
     Query<T> q = ofy().query(clazz); 

     // Add all non-null properties to query filter 
     for (Field field : clazz.getDeclaredFields()) 
     { 
      // Ignore transient, embedded, array, and collection properties 
      if (field.isAnnotationPresent(Transient.class) 
       || (field.isAnnotationPresent(Embedded.class)) 
       || (field.getType().isArray()) 
       || (Collection.class.isAssignableFrom(field.getType())) 
       || ((field.getModifiers() & BAD_MODIFIERS) != 0)) 
       continue; 

      field.setAccessible(true); 

      Object value; 
      try 
      { 
       value = field.get(exampleObj); 
      } 
      catch (IllegalArgumentException e) 
      { 
       throw new RuntimeException(e); 
      } 
      catch (IllegalAccessException e) 
      { 
       throw new RuntimeException(e); 
      } 
      if (value != null) 
      { 
       q.filter(field.getName(), value); 
      } 
     } 

     return q; 
    } 

    // Added, but may not be really useful 
    public Query<T> query(String filter, String value) { 
     Query<T> q = ofy().query(clazz).filter(filter, value); 
     return q; 

} 

與Objectify4的瓶頸是,它並沒有DAOBase所以它不是很容易遷移現有的代碼。

如何在使用Objectify4功能時使用此模式?

回答

1

您可以OfyService獲取代碼在這裏: https://code.google.com/p/objectify-appengine/wiki/BestPractices 添加靜態導入在ObjectifyGenericDao,然後你可以使用類似的方法:

public Key<T> save(T entity){ 
    return ofy().save().entity(entity).now(); 
} 

public void delete(T entity){ 
    ofy().delete().entity(entity); 
} 

public T get(Long id){ 
    return ofy().load().type(clazz).id(id).get(); 
} 

等等...