如何使用多个主键

时间:2012-05-06 09:42:23

标签: android ormlite

我创建了数据库,对于我的Android应用程序,女巫有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;

请你告诉我如何将这个表映射到类(这个类应该如何),是否可能?

4 个答案:

答案 0 :(得分:20)

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

  

@DatabaseField(uniqueCombo = true)

Here are the docs on uniqueCombo.

答案 1 :(得分:12)

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

在你的吸气器中,你可以返回你的田地组合。

在您的示例中,这看起来像这样:

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

...

public String getId(){

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

}
public void setId(String id){

    this.id = id;

}

http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/field/DatabaseField.html#useGetSet()

答案 2 :(得分:5)

  

限制

     

为简单起见,并且能够在db4o,memcached,redis或文件系统上保持相同的POCO类(即   ServiceStack中包含的提供者),每个模型必须有一个   主键,按照惯例,OrmLite希望它是Id,尽管你   使用[Alias(“DbFieldName”)]属性将其映射到带有的列   不同的名称或使用[PrimaryKey]属性告诉OrmLite   为主键使用不同的属性。

     

你仍然可以从这些表中选择,你将无法做到   利用依赖它的API,例如更新或删除的位置   过滤器是隐含的(即未指定),所有以...结尾的API   ById等。

     

解决方法单个主键限制

     

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

public class OrderDetail
{
    public string Id { get { return this.OrderId + "/" + this.ProductId; } }



public int OrderId { get; set; }
    public int ProductId { get; set; }
    public decimal UnitPrice { get; set; }
    public short Quantity { get; set; }
    public double Discount { get; set; }
}

https://github.com/ServiceStack/ServiceStack.OrmLite/#limitations

答案 3 :(得分:0)

设计

ServiceStack's OrmLite不支持多个复合主键。为了使相同的POCO在数据库之外有用(例如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; }
}