Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 域类中的ForeignCollection初始化_Java_Android_Sqlite_Ormlite_Foreign Collection - Fatal编程技术网

Java 域类中的ForeignCollection初始化

Java 域类中的ForeignCollection初始化,java,android,sqlite,ormlite,foreign-collection,Java,Android,Sqlite,Ormlite,Foreign Collection,我有一个具有多对多关系的域对象菜单可以有许多类别,类别可以在许多菜单中菜单负责类别 我为我的应用程序做了分层设计,域类与DAO-s(我有一个特殊的同步类,用于访问工厂和存储库类并保持关系同步)和应用程序层严格分离(我在那里使用服务,例如所有逻辑所在的AddMenuService) 例如,我创建了一个菜单和类别对象。通过特殊的appender类将该类别添加到菜单中。然后我同步对象(验证、检查数据库中是否存在对象或创建一个新对象,如果需要调用其他同步类,比较差异中的对象并保存或更新它们)。只能通过M

我有一个具有多对多关系的域对象<代码>菜单可以有许多
类别
类别
可以在许多
菜单
中<代码>菜单负责
类别

我为我的应用程序做了分层设计,域类与
DAO
-s(我有一个特殊的同步类,用于访问工厂和存储库类并保持关系同步)和应用程序层严格分离(我在那里使用服务,例如所有逻辑所在的
AddMenuService

例如,我创建了一个
菜单
类别
对象。通过特殊的appender类将该类别添加到菜单中。然后我同步对象(验证、检查数据库中是否存在对象或创建一个新对象,如果需要调用其他同步类,比较差异中的对象并保存或更新它们)。只能通过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.getEmptyForeignCollection(字符串字段名);
,但是有没有办法初始化
ForeginCollection类别;
菜单
类和
ForeginCollection菜单中;
类别
类中,而不首先访问DAO对象,因为这些集合没有初始化,所以我一直得到
NullReference
异常

班级 菜单类

@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;
   }
   @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;
      }
   }

提前感谢,evilone

只要调用
.iterator()
就足以正确初始化您的集合。

所以调用Menu.getCategories()中的categories.iterator()不会给我NullReference?我无法调用iterator(),因为ForeignCollection categories为null,它会创建NullReferenceError。你想问dude什么?你想在不使用DAO的情况下初始化集合吗?如果你在没有连接DAO的菜单中添加一个类别,会发生什么情况?@Gray是的,我想初始化集合,但不想在菜单中弄乱DAO域类,你是对的。这可以用NHibernate来完成。想知道是否有办法做到这一点。如果没有,那么我如何在域中使用尽可能少的DAO来完成。你能回答另一个问题@evione吗?如果你在菜单中添加一个没有DAO的类别会发生什么?另外,它在NHibernate中是如何工作的?如何在那里初始化集合?@Gray我不明白你说的另一个问题是什么意思。在Nhibernate中,我用xml创建映射文件(也可以在类中完成)。我在域的类构造函数中初始化集合,只需调用IList objects=new List()。例如,叹气。我明白你是如何做到这一点的。我想知道的是我现在在评论中问了两次的问题。如果你在菜单中添加了一个没有DAO的类别,会发生什么?请回答这个问题。