10

我为我的 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

4 回答 4

21

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

@DatabaseField (uniqueCombo = true)

这是关于uniqueCombo.

于 2012-05-06T09:55:17.520 回答
12

可以生成由其他字段组成的人工 ID 字段。这可以通过将注释中的useSetGet属性设置为 true 来完成。@DatabaseField这使得 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()

于 2013-12-17T15:48:34.637 回答
7

限制

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

您仍然可以从这些表中选择,您将无法使用依赖它的 API,例如隐含过滤器(即未指定)的更新或删除,所有以 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

于 2012-12-03T14:01:30.707 回答
0

ServiceStack 的 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; }
}
于 2013-02-20T00:30:54.013 回答