Как получить весь набор данных в отношениях «многие ко многим», используя ormlite? - PullRequest
2 голосов
/ 11 декабря 2011

Я только начал использовать OrmLite, поэтому я играю с ним. У меня проблемы с пониманием нескольких концепций, особенно иметь дело со многими отношениями.

Это мои основные таблицы:

Pc
    Name
    Domain
Ethernet
    IP
    Gateway
    Subnet
    MAC

А вот те, которые обеспечивают отношения «многие ко многим», как в примере онлайн:

PcEth

Я заполняю базу данных через:

    PC somePc = new PC("randomPc", "someDomain");
    pcDao.create(somePc);

    Ethernet eth1 = new Ethernet("127.255.0.1", "255.0.0.0", "192.168.1.1", "macadress");
    Ethernet eth2 = new Ethernet("192.168.1.1", "255.0.0.0", "192.168.1.1", "macadress");
    ethernetDao.create(eth1);
    ethernetDao.create(eth2);

    pcEthernetDao.create(new PcEthernet(somePc, eth1));

Но я совершенно не уверен, каким образом я получаю все данные, которые принадлежат ПК, обратно. Я как бы ожидал

    PC pc = pcDao.queryForId(1);

для автоматического извлечения данных из других таблиц. Разве это не то, что должен делать ORM? Имея объект, поэтому мне не нужно заботиться о базовой базе данных? Тем не менее, все, что я получил, - это всего лишь объект Pc.object, который имеет только определенные компьютером атрибуты. (С другой стороны, это не , что удивительно, поскольку я имею дело только с pcDao.)

Но как мне построить запрос, чтобы получить «метаобъект», содержащий все данные, принадлежащие ПК? Объект, который включает в себя данные ПК, а также список ethernetDevices, принадлежащих к ПК (который также включает их собственный список Dns-адресов), а также список программного обеспечения и операционных систем.

Должен ли я теперь вручную решать зависимости? Запросить Pc, попросить PcEthernet-таблицу получить соответствующие идентификаторы, получить EthernetDevice и т. Д.?

Или есть хитрость, которую я еще не совсем уловил?

Ответы [ 2 ]

3 голосов
/ 12 декабря 2011

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

Разве это не то, что должен делать ORM?

Да, хотяORMLite постоянно ведет войну «размер против набора функций».Он был спроектирован и построен как «облегченный» ORM, и с этой целью он никогда не будет поддерживать полный набор функций ORM, таких как Hibernate или iBatis.

Что вы можете делать с ORMLiteи ваш набор данных должен иметь, как упоминал @Emmanuel, @ForeignCollectionField в ваших Pc и Ethernet объектах.

public class Pc {
    @DatabaseField(generatedId = true)
    private long id;
    @ForeignCollectionField
    private ForeignCollection<PcEthernet> pcEthernets;
    ...
}

Когда вы получите Pc, отдельный запрос будет заполненв pcEthernets.Но затем вам нужно будет выполнить запросы, чтобы самостоятельно получить связанные Ethernet объекты.

До этого были запросы на автоматическую генерацию таблиц соединения и автоматический запрос IN.Если вы хотите обрисовать в общих чертах, как это будет работать или помогать в разработке, обязательно подпишитесь на список рассылки для разработчиков ORMLite .

Наконец, в этом случае вам действительно нужно многоотношения ко многим?Разве у объекта Ethernet нет только одного объекта Pc?

3 голосов
/ 11 декабря 2011

Вы можете посмотреть пример «многие ко многим» в репозитории ormlite.

В их примере у них есть таблицы User, Post и UserPost. Поэтому они используют объект для представления таблицы соединений UserPost и запрашивают отношения, используя это. Без магии.

Возможно, вы можете получить автозаполнение посторонних объектов с помощью аннотации @ForeignCollectionField с обеих сторон отношения m2m.

...