ORMLite - заставить объекты чтения иметь одинаковую идентичность - PullRequest
2 голосов
/ 14 июля 2011

Я читаю иерархию объектов с ORMLite.Он имеет форму дерева, у родителей есть @ForeignCollection из 0+ детей, и каждый ребенок ссылается на своего родителя с @DatabaseField(foreign=true).Я читаю и сохраняю всю иерархию сразу.

Поскольку я новичок в ORM в целом и в ORMLite, я не знал, что когда объекты с имеют одинаковый идентификатор в базе данных считываются, они не будут созданы как фактически один и тот же объект с такой же идентичностью , но как несколько дубликатов с одинаковым идентификатором ,Это значит, что сейчас я сталкиваюсь с проблемой, которая (скажем, "->" означает "относится к") A -> B -> C! = C -> B -> A.

Я думалчтобы решить проблему, вручную прочитав их через предоставленные DAO и собрав их вместе по их идентификатору, гарантируя, что объекты с одинаковым идентификатором имеют одинаковую идентичность .

Есть ли ORMLite-nativeспособ решить это?Если да, что это, если нет, каковы общие способы решения этой проблемы?Это общая проблема ORM?У него есть имя (я хотел бы узнать о нем больше)?

Редактировать:

Моя иерархия такова, что одно здание состоит из нескольких этажей, где каждый этаж знает свое здание, икаждый этаж содержит несколько зон, где каждая зона знает свой этаж.

Ответы [ 2 ]

3 голосов
/ 22 июля 2011

Это общая проблема ORM?У него есть имя (я хотел бы узнать о нем больше)?

Это общий шаблон для ORM, который называется «Карта идентичности»: внутри сеанса, независимо от того, где он находится в вашемВ коде вы получили сопоставленный объект из ORM, будет только один объект, представляющий определенную строку в БД (т.е. имеющий его первичный ключ).

Мне нравится этот шаблон: вы можете извлечь что-то из БД водна часть вашего кода, даже вносить в нее изменения, сохранять этот объект в переменной экземпляра и т. д. И в другой части кода, если вы получаете объект для той же самой «строки БД» (каким бы то ни было способом: вы получили его в качестве аргумента, вы сделали массовый запрос к БД, вы создали «новый» сопоставленный объект с первичным ключом, установленным на тот же самый, и добавили его в сеанс), в результате вы получите тот же объект,- Даже изменения, которые были до этого (в том числе не очищенные), будут там.

(добавление сопоставленного объекта в сеанс может произойти из-за этого, и в зависимости от ORM и языка программирования это добавление может вернуть вам другой объект)как «то же самое»)

1 голос
/ 14 июля 2011

К сожалению, нет ORMLite-нативного способа решения этой проблемы.Более сложные системы ORM (такие как Hibernate) имеют слои кэширования, которые по этой причине существуют , в частности .ORMLite не имеет слоя кэша, поэтому он не знает, что он только что возвратил объект с тем же идентификатором «недавно».Вот документация по кешированию Hibernate:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html

Однако ORMLite спроектирован так, чтобы быть Lite, и слои кэша нарушают это обозначение IMO.Единственное [неудачное] решение, которое я вижу для вашей проблемы в ORMLite, - это делать то, что вы делаете, - перестраивать дерево объектов на основе идентификаторов.Если вы дадите более подробную информацию о вашей иерархии, мы сможем помочь вам более конкретно.


Поэтому, подумав о вашем случае немного подробнее @riwi, мне пришло в голову, что если у вас есть Здание, которое содержитВ коллекции этажей нет причин, по которым объект Building на каждом из этажей в коллекции нельзя установить с родительским объектом Building.Duh.ORMLite имеет всю информацию, необходимую для этого.Я реализовал это поведение, и оно было выпущено в версии 4.24.

Редактировать:

Начиная с ORMLite версии 4.26 мы добавили первоначальный вариантобъектный кеш, который может поддерживать запрашиваемые функции.Вот документы:

http://ormlite.com/docs/object-cache

...