Android 如何使用多个主键

Android 如何使用多个主键,android,ormlite,Android,Ormlite,我为我的android应用程序创建了数据库,witch有16个表。我想使用ORMlite映射。问题是,我没有找到具有复合id(多个主键)的示例。例如,我有一个表: CREATE TABLE IF NOT EXISTS `Tourist_Guide`.`Cultural_activity` ( `City_Id` INT NOT NULL , `activity_Id` INT NOT NULL , `Cultural_activity_Id` INT NOT NULL AUTO_I

我为我的android应用程序创建了数据库,witch有16个表。我想使用ORMlite映射。问题是,我没有找到具有复合id(多个主键)的示例。例如,我有一个表:

CREATE  TABLE IF NOT EXISTS `Tourist_Guide`.`Cultural_activity` (
  `City_Id` INT NOT NULL ,
  `activity_Id` INT NOT NULL ,
  `Cultural_activity_Id` INT NOT NULL AUTO_INCREMENT ,
  `Name_Of_Cultural_activity` VARCHAR(30) NOT NULL ,
  PRIMARY KEY (`Cultural_activity_Id`, `City_Id`, `activity_Id`) ,
  INDEX `fk_Cultural_activity_activity1` (`City_Id` ASC, `activity_Id` ASC) ,
  CONSTRAINT `fk_Cultural_activity_activity1`
    FOREIGN KEY (`City_Id` , `activity_Id` )
    REFERENCES `Tourist_Guide`.`activity` (`City_Id` , `activity_Id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

您能告诉我如何将该表映射到类(该类应该是什么样子)吗?这可能吗?

您必须在每个唯一字段上方使用以下注释:

@数据库字段(uniqueCombo=true)

局限性 为了简单起见,并且能够在db4o、memcached、redis或文件系统(即。 ServiceStack中包含的提供程序),每个模型必须有一个 按照约定,主键OrmLite希望它是Id,但 使用[Alias(“DbFieldName”)]属性将其映射到具有 不同的名称或使用[PrimaryKey]属性告诉OrmLite 对主键使用其他属性

您仍然可以从这些表中进行选择,您将无法 使用依赖于它的API,例如,更新或删除 过滤器是隐含的(即未指定),所有以 ById等

解决单个主键限制的方法 支持具有多个主键的表的潜在解决方法是 创建自动生成并返回唯一值的Id属性的步骤 基于所有主键字段,例如:

按设计,不支持多个复合主键。为了使同一POCO在db之外有用(例如NoSQL数据存储、缓存提供程序等),OrmLite要求每种类型都有一个主键,我的默认值是
Id
属性(可使用ModelConfig类或
[PrimaryKey]
[Alias]
属性覆盖)

克服此限制的解决方法包括创建单个唯一Id,但在复合主键上包含唯一约束,例如:

[CompositeIndex("CompositePkId1","CompositePkId2", Unique = true)] 
public class Poco 
{
    [AutoIncrement]
    public int Id { get; set; }
    public int CompositePkId1 { get; set; }
    public int CompositePkId2 { get; set; }
}
public class Poco 
{
    public string Id { get { return CompositePkId1 + ":" + CompositePkId2; } }
    public int CompositePkId1 { get; set; }
    public int CompositePkId2 { get; set; }
}
或创建包含所有主键组合的伪列,例如:

[CompositeIndex("CompositePkId1","CompositePkId2", Unique = true)] 
public class Poco 
{
    [AutoIncrement]
    public int Id { get; set; }
    public int CompositePkId1 { get; set; }
    public int CompositePkId2 { get; set; }
}
public class Poco 
{
    public string Id { get { return CompositePkId1 + ":" + CompositePkId2; } }
    public int CompositePkId1 { get; set; }
    public int CompositePkId2 { get; set; }
}

可以生成由其他字段组成的人工ID字段。 这可以通过将
@DatabaseField
注释中的属性设置为true来实现。 这使得ORMLite调用getter和setter方法,而不是使用反射

在getter中,您可以返回字段的组合

在您的示例中,这类似于:

@DatabaseField(id=true, useGetSet=true)
private String id;

...

public String getId(){

    return culturalAcitivityId +"-" +cityId +"-" +activityId;

}
public void setId(String id){

    this.id = id;

}

我读了这篇文章,所以我感到困惑,因为:“Hrm.Ormlite目前不支持复合ID。例如,Hibernate将复合ID作为嵌入式类处理,我想Ormlite需要支持这些类才能使其正常工作。”如果你看一下日期,你应该注意到讨论是在2011年1月。但是,三个月后添加了
uniqueCombo
,如(search=“uniqueCombo”)。ORMLite仍然不支持复合ID。但是,它确实支持提供唯一约束的索引。这篇文章是关于ORMLite Java ORM库而不是service-stack的。如果您的实体具有外部集合,此解决方案可能会导致某些问题。更新不急于/自动刷新其外部父对象的外部集合对象时,外部id将设置为null/0/默认值,因为OrmLite将正确加载它们并使用setId()设置id,但更新时将尝试使用getId,这将“销毁”如果对象已被延迟加载,您的外部连接将被延迟加载。useSetGet仍然使用反射,但不是直接字段访问,而是使用getter和setter方法。这个问题是关于sevicestack或ormlite还是关于Java ORM库的?您在下面检查的答案是关于servicestack的。