2015-06-08 2 views
0
@Entity 
public class Category { 

    @Id 
    private Long id; 
    private String name; 
    private String description; 

    @Load 
    private List<Ref<Subcategory>> subcategories = new ArrayList<Ref<Subcategory>>(); 
    @Load 
    private Ref<Image> image; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public List<Subcategory> getSubcategories() { 
     List<Subcategory> scs = new ArrayList<Subcategory>(); 
     for (Ref<Subcategory> sc : this.subcategories) { 
      scs.add(sc.get()); 
     } 
     return scs; 
    } 

    public void setSubcategory(Subcategory subcategory) { 
     this.subcategories.add(Ref.create(subcategory)); 
    } 

    public Image getImage() { 
     if(image != null) { 
      return image.get(); 
     } 
     return null; 
    } 

    public void setImage(Image image) { 
     this.image = Ref.create(image); 
    } 
} 

@Entity 
public class Subcategory { 

    @Id 
    private Long id; 
    private String name; 
    private String description; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

public class CategoryDTO { 

    private Long id; 

    @NotNull 
    private String name; 
    private String description; 

    private List<Subcategory> subcategories = new ArrayList<Subcategory>(); 
    private Long imageId; 

    public CategoryDTO() { 
    } 

    public CategoryDTO(Category category) { 
     this.id = category.getId(); 
     this.name = category.getName(); 
     this.description = category.getDescription(); 
     this.subcategories = category.getSubcategories(); 

     if (category.getImage() != null) { 
      this.imageId = category.getImage().getId(); 
     } 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 

    public List<Subcategory> getSubcategories() { 
     return subcategories; 
    } 

    public void setSubcategories(List<Subcategory> subcategories) { 
     this.subcategories = subcategories; 
    } 

    public Long getImageId() { 
     return imageId; 
    } 

    public void setImageId(Long imageId) { 
     this.imageId = imageId; 
    } 

} 

CategoryDAOобъективизации Java Ссылка

public class CategoryDAO { 

    private static final Logger log = Logger.getLogger(CategoryService.class.getName()); 

    public static QueryResultIterator<Category> getCategories() { 
     QueryResultIterator<Category> categories = ofy().load().type(Category.class).iterator(); 
     return categories; 
    } 
} 

public class SubcategoryDAO { 

    public static Subcategory createSubcategory(Long categoryId, Subcategory data) { 
     // save sub category 
     Subcategory subcategory = new Subcategory(); 
     if (data.getName() != null) { 
      subcategory.setName(data.getName()); 
     } 
     if (data.getDescription() != null) { 
      subcategory.setDescription(data.getDescription()); 
     } 
     ofy().save().entity(subcategory).now(); 

     Category category = 
      ofy().load().type(Category.class).id(categoryId).get(); 
     category.setSubcategory(subcategory); 
     ofy().save().entity(category).now(); 

     return subcategory; 
    } 
} 

CategoryService

@Path("/categories") 
public class CategoryService { 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public String getCategories() { 
     try { 
      List<CategoryDTO> categories = new ArrayList<CategoryDTO>(); 
      QueryResultIterator<Category> cats = CategoryDAO.getCategories(); 
      while (cats.hasNext()) { 
       categories.add(new CategoryDTO(cats.next())); 
      } 
      Map<String, List<CategoryDTO>> map = new HashMap<String, List<CategoryDTO>>(); 
      map.put("categories", categories); 
      return Helper.prepareResponse(map); 
     } catch (Exception e) { 
      LogService.getLogger().severe(e.getMessage()); 
      throw new WebApplicationException(500); 
     } 
    } 
} 

Проблема: -

Когда я ударил getCategories службы, он показывает неожиданную behaviour.Instead показывать все подкатегории , каждый раз он показывает произвольное количество разных подкатегорий.

Например сказать, первый я сохранить категории "С" тогда я сохранить Подкатегории "SA", "СО" и "SC"

На ударяя службе getCategry,

Ожидаемое поведение -

{ 
    "status": 200, 
    "categories" : [{ 
     "name":a, 
     "subcategories": [ 
      { 
       "name":"sa" 
      }, 
      { 
       "name":"sb" 
      }, 
      { 
       "name":"sc" 
      } 
     ] 
    }] 
} 

Выходы я получаю что-то вроде этого -

{ 
    "status": 200, 
    "categories" : [{ 
     "name":a, 
     "subcategories": [ 
      { 
       "name":"sa" 
      }, 
      { 
       "name":"sc" 
      } 
     ] 
    }] 
} 

или

{ 
    "status": 200, 
    "categories" : [{ 
     "name":a, 
     "subcategories": [{ 
      "name":"sb" 
     }] 
    }] 
} 

ответ

-1

Добро пожаловать в удивительный мир возможной последовательности. Когда я столкнулся с чем-то подобным, использование ObjectifyService.begin() вместо ObjectifyService.ofy() разрешило его. В отличие от ofy(), begin() получает свежие данные каждый раз.

+0

Я использовал ObjectifyService.factory(). Begin() вместо ObjectifyService.ofy(), и он сработал. Спасибо, что вы спасли мой день. Плохо я не могу повышать, потому что у меня недостаточно очков. –

+0

Это абсолютно, 100% неправильный ответ. Если это имеет значение, это потому, что у вас не установлен 'ObjectifyFilter'. При таком подходе появятся очень странные ошибки в будущем, потенциально включая поврежденные значения кеша и утечки памяти. Прочтите javadocs для begin(), чтобы понять, что вы делаете. – stickfigure

+0

Я должен добавить, что если бы это имело значение, это, вероятно, потому, что вы ждали достаточно долго, чтобы индекс мог реплицироваться (и, следовательно, данные стали согласованными). У вашего изменения кода не было (положительного) эффекта. Если вы используете недавнюю версию Objectify, она не позволит вам работать без установленного фильтра. – stickfigure

1

Чтобы подвести итоги данного вопроса, вы выполняете запрос (даете список всех категорий) и возвращаете непоследовательные результаты.

Это система, которая рекламируется. Прочитайте это: https://cloud.google.com/appengine/docs/java/datastore/structuring_for_strong_consistency

Возможная последовательность - это то, чему вы научились жить и работать, когда вам это нужно. Невозможно заставить запрос быть строго согласованным без изменения структуры ваших данных - скажем, поставить его под одну группу сущностей - но это также имеет последствия. Нет бесплатного обеда, если вы хотите получить глобально реплицированную, бесконечно масштабируемую базу данных.

В дополнение к возможной согласованности, хранилище данных не имеет определенного порядка упорядочения, если вы не укажете порядок сортировки в своем запросе. Так что это может добавить к вашей путанице.

 Смежные вопросы

  • Нет связанных вопросов^_^