如何使用多个主键(How to use multiple primary keys)

2019-06-24 05:30发布

我创建的数据库,为我的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;

你能请告诉我如何映射此表类(这个类应该怎么样子),是可能?

Answer 1:

限制

为了简单起见,并且能够以具有相同POCO类db4o中,分布式缓存,redis的或在文件系统中持续(包含在ServiceStack即提供者),每个模型必须有一个单一的主键,按照惯例OrmLite希望它是标识虽然使用[别名(“DbFieldName”)]属性它,它以不同的名称映射到列或使用[的PrimaryKey]属性告诉OrmLite使用不同属性的主键。

您仍然可以从这些表中选择,你只是无法使用依赖于它的API,如更新或删除其中滤波器是隐含(未指定IE),所有以ById,等结束的API

解决方法单一主键限制

支持表与多个主键的一个潜在的解决方法是创建一个自动生成的返回基于所有的主键字段,如独特的价值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



Answer 2:

你必须使用上述每一个独特的领域如下批注:

@DatabaseField(uniqueCombo =真)

下面是对文档uniqueCombo



Answer 3:

有可能产生其中包括其他字段的组合物的人工ID字段。 这可以通过设置来完成useSetGet物业在@DatabaseField注释为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()



Answer 4:

ServiceStack的OrmLite设计不支持多重复合主键。 为了让您的相同波苏斯是一个分贝的有用外部(例如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; }
}


文章来源: How to use multiple primary keys