ORMLite ForeignCollections

时间:2012-06-21 10:04:00

标签: java foreign-keys ormlite foreign-collection

我有一个问题,我只是不知道如何解决它。 我想在JAVA中建模如下结构:公司活动地点

  • 每家公司都包含一个或多个位置,代表公司分支机构所在的地方
  • 每个活动还有一个活动地点

以下是代码:

public class Event {
    int id;
    String name;
    Location location;
    ...
}

public class Location {
    int id;
    String name;
    String building;
    ...
}

public class Company {
    int id;
    String name;
    Collection<Location> locations;
    ...
}

我的问题是我想使用ORMLite来保存数据库中的对象。但如果我正确理解了ORMLite中的异物,我必须将一个Company实例变量添加到Location:

public class Location {
  @DatabaseField(columnName = "com_id", foreign = true)
  Company company;
  @DatabaseField(id = true, columnName = "loc_id")
  int id;
  @DatabaseField(columnName = "loc_name")
  String name;
  @DatabaseField(columnName = "loc_build")
  String building;
  ...
}

public class Company {
  @DatabaseField(columnName = "com_id")
  int id;
  @DatabaseField(columnName = "com_name")
  String name;
  @ForeignCollectionField()
  Collection<Location> locations;
  ...
}

但现在位置不适用于活动!?!我该如何实现这样的行为?

感谢您的回答

1 个答案:

答案 0 :(得分:0)

不知何故,您需要Location分配Company的“所有权”。你可以(至少)以两种不同的方式做到这一点。

  1. 如您所述,您可以Location有一个Company字段。如果那里有一对一的关系,这将工作正常。如果您想要一个"Pittsburgh" Location并且您希望"Alcoa""US Steel"公司在匹兹堡拥有一个位置,那么它将无效。

  2. 实现它的第二种方法是拥有一个CompanyLocation实体,通常在ORM语言中称为连接表。但是,ORMLite不会为您创建此连接表。

    public class CompanyLocation {
       @DatabaseField(foreign = true)
       Company company;
       @DatabaseField(foreign = true)
       Location location;
    }
    

    因此,如果希望"Alcoa"拥有Location "Pittsburgh",您需要在定义关系的表格中插入CompanyLocation

  3. 希望这有帮助。