ORMLite - заставить объекты чтения иметь одинаковую идентичность
Я читаю иерархию объектов с ORMLite. Он имеет форму дерева, у родителей есть @ForeignCollection
из 0+
дети, и каждый ребенок ссылается на своего родителя с @DatabaseField(foreign=true)
, Я читаю и сохраняю всю иерархию одновременно.
Поскольку я новичок в ORM в целом, а также в ORMLite, я не знал, что при чтении объектов с одинаковым идентификатором в базе данных они не будут создаваться как фактически один и тот же объект с одинаковой идентичностью, но как несколько дубликатов, имеющих одинаковый идентификатор. Это означает, что я столкнулся с проблемой, которая (скажем, "->" означает "относится к") A -> B -> C!= C -> B -> A.
Я думал решить эту проблему, читая их вручную через предоставленные DAO и соединяя их по их идентификатору, гарантируя, что объекты с одинаковым идентификатором имеют одинаковую идентичность.
Есть ли ORMLite-родной способ решения этой проблемы? Если да, что это, если нет, каковы общие способы решения этой проблемы? Это общая проблема ORM? У него есть имя (я хотел бы узнать больше об этом)?
Редактировать:
Моя иерархия такова, что одно здание содержит несколько этажей, где каждый этаж знает свое здание, и каждый этаж содержит несколько зон, где каждая зона знает свой этаж.
2 ответа
К сожалению, нет ORMLite-нативного способа решения этой проблемы. Более сложные системы ORM (такие как Hibernate) имеют уровни кэширования, которые существуют именно по этой причине. ORMLite не имеет слоя кэша, поэтому он не знает, что он только что возвратил объект с тем же идентификатором "недавно". Вот документация о кешировании Hibernate:
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html
Тем не менее, ORMLite разработан, чтобы быть Lite и слои кэша нарушают это обозначение IMO. Единственное [неудачное] решение, которое я вижу для вашей проблемы в ORMLite, - это делать то, что вы делаете, - перестраивать дерево объектов на основе идентификаторов. Если вы предоставите более подробную информацию о вашей иерархии, мы сможем помочь вам более конкретно.
Поэтому, подумав о вашем случае немного больше @riwi, мне пришло в голову, что если у вас есть здание, содержащее коллекцию этажей, то нет причин, по которым объект Building на каждом из этажей в коллекции нельзя установить с помощью родительский строительный объект. Duh. ORMLite обладает всей информацией, необходимой для этого. Я реализовал это поведение, и оно было выпущено в версии 4.24.
Редактировать:
Начиная с версии 4.26 ORMLite, мы добавили первоначальный подход к объектному кешу, который может поддерживать запрашиваемые функции. Вот документы:
Это общая проблема ORM? У него есть имя (я хотел бы узнать больше об этом)?
Это общий шаблон для ORM, который называется "Карта идентичности": в сеансе, независимо от того, где в вашем коде вы получили сопоставленный объект из ORM, будет только один объект, представляющий конкретную строку в БД (т.е. имеющий это первичный ключ).
Мне нравится этот шаблон: вы можете извлечь что-то из БД в одной части вашего кода, даже внести в него изменения, сохранить этот объект в переменной экземпляра и т. Д. И в другой части кода, если вы получите объект для той же самой "строки БД" (каким бы ни было: вы получили его в качестве аргумента, вы сделали массовый запрос к БД, вы создали "новый" сопоставленный объект с первичным ключом, установленным на то же самое, и добавили его к сеансу), вы в конечном итоге с тем же объектом. - Даже модификации, которые были до этого (в том числе немытые), будут там.
(добавление сопоставленного объекта в сеанс может быть неудачным из-за этого, и в зависимости от ORM и языка программирования это добавление может вернуть вам другой объект как "тот же")