Вопрос по android – Как использовать несколько первичных ключей

9

Я создал базу данных, для моего приложения для Android, ведьма имеет 16 таблиц. Я хочу использовать ORMlite Mapping. Проблема в том, что я не нашел примеров, когда у вас есть составной идентификатор (несколько первичных ключей). Например, у меня есть таблица:

<code>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;
</code>

Подскажите, пожалуйста, как сопоставить эту таблицу с классом (как должен выглядеть этот класс), возможно ли это?

Был ли этот вопрос о sevicestack ormlite или ormlite библиотеки Java ORM. Ответ, который вы проверили ниже, о пакете услуг. Gray

Ваш Ответ

4   ответа
0

ServiceStack's OrmLite по конструкции не поддерживает множество составных первичных ключей. Для того чтобы ваши POCO были полезны вне базы данных (например, хранилища данных NoSQL, поставщики кэша и т. Д.) OrmLite ожидает один первичный ключ для каждого типа, который по умолчанию являетсяId свойство (можно переопределить с помощью класса ModelConfig или[PrimaryKey], [Alias] атрибуты).

Обходные пути для преодоления этого ограничения включают создание единого уникального идентификатора, но включают уникальное ограничение для составных первичных ключей, например:

[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; }
}
Пост был про ORMLite библиотеку Java ORM, а не сервис-стек.
5
Limitations

and to be able to have the same POCO class persisted in db4o, memcached, redis or on the filesystem (i.e. providers included in ServiceStack), each model must have a single primary key, by convention OrmLite expects it to be Id although you use [Alias("DbFieldName")] attribute it map it to a column with a different name or use the [PrimaryKey] attribute to tell OrmLite to use a different property for the primary key.

You can still SELECT from these tables, you will just be unable to make use of APIs that rely on it, e.g. Update or Delete where the filter is implied (i.e. not specified), all the APIs that end with ById, etc.

Workaround single Primary Key limitation

A potential workaround to support tables with multiple primary keys is to create an auto generated Id property that returns a unique value based on all the primary key fields, e.g:

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

12

которое состоит из композиции других полей. Это можно сделать с помощью настроекuseSetGet Недвижимость в@DatabaseField Аннотация к истине. Это заставляет ORMLite вызывать методы получения и установки вместо использования отражения.

В своем геттере вы можете вернуть композицию ваших полей.

Это будет выглядеть примерно так в вашем примере:

@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 ()

useSetGet по-прежнему использует отражение, но вместо прямого доступа к полю используются методы получения и установки.
Это решение может вызвать определенные проблемы, если у вашей организации есть иностранная коллекция. При обновлении сторонних объектов коллекции, которые не хотят / автоматически обновляют своих внешних родителей, внешний идентификатор будет установлен в значение null / 0 / default, потому что OrmLite загрузит их правильно и установит идентификатор с помощью setId (), но при обновлении попытается используйте getId, который будет "уничтожать" Ваше внешнее соединение, если объекты были загружены лениво.
20

@DatabaseField (uniqueCombo = true)

Вот документы наuniqueCombo.

Если вы посмотрите на дату, вы должны заметить, что обсуждение было в январе 2011 года. Но,uniqueCombo был добавлен через три месяца, как вы можете видеть вchangelog (search = & quot; uniqueCombo & quot;).
согласовано,uniqueCombo не определяет составной ключ.
ORMLite все еще делаетnot Поддержка идентификаторов композиторов. Однако он поддерживает индексы, которые предоставляют уникальные ограничения.
Я прочитал эту статью,groups.google.com/group/ormlite-user/browse_thread/thread/…, поэтому я запутался, потому что: "Хм. В настоящее время Ormlite не поддерживает составные идентификаторы. Hibernate, например, обрабатывает составные идентификаторы как встроенные классы, которые, я думаю, Ormlite должен был бы поддерживать, чтобы заставить это работать. & Quot; sekula87

Похожие вопросы