3

多対多の関係を持つドメイン オブジェクトがあります。Menuは多数持つことができ、多くの中Categoriesに入ることができます。を担当しています。CategoryMenusMenuCategories

私は自分のアプリケーション用に非常に階層化された設計を行い、ドメイン クラスはDAO-s (ファクトリ クラスとリポジトリ クラスにアクセスし、関係を同期させるための特別な同期クラスを持っています) およびアプリケーション層 (そこでサービスを使用します。たとえばAddMenuService、すべての場所でロジックが存在します)。

たとえば、MenuandCategoryオブジェクトを作成します。特別なアペンダー クラスを介して、このカテゴリをメニューに追加します。次に、オブジェクトを同期します (検証、オブジェクトがデータベースに存在するかどうかを確認するか、新しいオブジェクトを作成し、必要に応じて他の Synchro クラスを呼び出し、相違点からオブジェクトを比較し、それらを保存または更新します)。カテゴリは、MenuSyncro を介してのみ追加できます。

Menu m1 = new Menu("Menu for vegetarians");
Category cat1 = new Category("Drinks");

m1.getAppender().addCategory(cat1);

MenuSyncro ms = new MenuSyncro();
ms.synchronize(menu1);

を使用できることはわかっていますが、最初にDAOオブジェクトにアクセスせずにクラス内およびクラス内で初期化する方法はありますか?これらのコレクションが初期化されていないために例外が発生Dao.getEmptyForeignCollection(String fieldName);し続けるためです?ForeginCollection<MenuCategory> categories;MenuForeignCollection<MenuCategory> menus;CategoryNullReference

クラス

Menu.class

@DatabaseTable(tableName = "MENUS")
public class Menu
{
   private final static String ID_FIELD_NAME = "ID";
   private final static String NAME_FIELD_NAME = "NAME";

   @DatabaseField(generatedId = true, columnName = ID_FIELD_NAME)
   private int id;

   @DatabaseField(columnName = NAME_FIELD_NAME, canBeNull = false, unique = true, useGetSet = true)
   private String name;

   @ForeignCollectionField(eager = false)
   private ForeignCollection<MenuCategory> categories;

   @ForeignCollectionField(eager = false)
   private ForeignCollection<LocationMenu> locations;

   private MenuAppender appender;

   public Menu()
   {
      // for ORMLite
   }

   public Menu(String name)
   {
      this.name = name;
   }

   public int getId() { return id; }
   public String getName() { return name; }
   public void setName(String name) { this.name = name; }

   public ArrayList<Category> getCategories()
   {
      ArrayList<Category> categoriesList = new ArrayList<Category>();

      if (categories != null)
         for (MenuCategory menuCategory : categories)
            categoriesList.add(menuCategory.getCategory());

      return categoriesList;
   }

   public ForeignCollection<LocationMenu> getLocations()
   {
      return locations;
   }

   public MenuAppender getAppender()
   {
      if (appender== null)
         appender= new MenuAppender(this);

      return appender;
   }
}

カテゴリ.クラス

@DatabaseTable(tableName = "CATEGORIES")
public class Category
{
   private final static String ID_FIELD_NAME = "ID";
   private final static String NAME_FIELD_NAME = "NAME";

   @DatabaseField(generatedId = true, columnName = ID_FIELD_NAME)
   private int id;

   @DatabaseField(columnName = NAME_FIELD_NAME, canBeNull = false, unique = true, useGetSet = true)
   private String name;

   @ForeignCollectionField(eager = false)
   private ForeignCollection<MenuCategory> menus;

   public Category()
   {
      // for ORMLite
   }

   public Category(String name)
   {
      this.name = name;
   }

   public int getId() { return id; }
   public String getName() { return name; }
   public void setName(String name) { this.name = name; }

   public ArrayList<Menu> getMenus()
   {
      ArrayList<Menu> menusList = new ArrayList<Menu>();

      if (menus != null)
         for (MenuCategory menuCategory : menus)
            menusList.add(menuCategory.getMenu());

      return menusList;
   }

}

MenuCategory.class

   @DatabaseTable(tableName = "MENUS_CATEGORIES")
   public class MenuCategory
   {
      private final static String ID_FIELD_NAME = "ID";
      private final static String MENUS_ID_FIELD_NAME = "MENUS_ID";
      private final static String CATEGORIES_ID_FIELD_NAME = "CATEGORIES_ID";

      @SuppressWarnings("unused")
      @DatabaseField(generatedId = true, columnName = ID_FIELD_NAME)
      private int id;

      @DatabaseField(foreign = true, columnName = MENUS_ID_FIELD_NAME, canBeNull = false, foreignAutoCreate = true, foreignAutoRefresh = true)
      private Menu menu;

      @DatabaseField(foreign = true, columnName = CATEGORIES_ID_FIELD_NAME, canBeNull = false, foreignAutoCreate = true, foreignAutoRefresh = true)
      private Category category;

      public MenuCategory()
      {
         // for ORMLite
      }

      public MenuCategory(Menu menu, Category category)
      {
         this.menu = menu;
         this.category = category;
      }

      public Menu getMenu()
      {
         return menu;
      }

      public void setMenu(Menu menu)
      {
         this.menu = menu;
      }

      public Category getCategory()
      {
         return category;
      }

      public void setCategory(Category category)
      {
         this.category = category;
      }
   }

前もってありがとう、悪人

4

1 に答える 1

-3

コレクションを適切に初期化するには、呼び出す<lazyCollection>.iterator()だけで十分です。

于 2013-01-02T06:30:21.530 に答える