2010-03-12 3 views
1

Я изучаю Hibernate из уроков на сайте JBoss. У меня есть путаница в примере кода, расположенном here.Hibernate - Одна проблема дизайна

Код Cat по адресу 4.1. A simple POJO example.

Этот Cat класс имеет ссылку на свою мать как private Cat mother;

Q1. Если класс имеет свойство идентификатора как id, то не лучше ли хранить идентификатор матери кошки вместо объекта матери кошки.

означает, что вместо

private Cat mother; 

не было бы лучше иметь

private long motherId; 

`

ответ

4

Это то, что спящий режим неявно делает для вас.

Хорошая вещь о ORM является то, что она полностью скрывает предостережения реализации из-за того, что вы работаете на RDBMS вместо этого с простыми объектами. Вы можете использовать mother как Cat, не беспокоясь о том, что его отношение выражается id внутренне.

1

Не обязательно хранить ссылку на объект, а не идентификатор полезен, поскольку он неявно проверяет ссылку, где в качестве Идентификатора может быть любое число, действительный идентификатор Cat или другой. Это дополнительный уровень проверки и проверки ошибок, с которыми вам приходится обращаться.

Единственная ошибка, с которой вы должны быть осторожны, является сериализацией объекта и гарантией того, что нет бесконечных циклов, и Dto's может помочь там. Например, скажите, что вы хотите сериализовать Cat в веб-сервисе, и вы хотите сериализовать только одну кошку, а не всю иерархию кошек (Cat, Mother Cat, Mother's Mother's Mother и т. Д.). Вы можете создать объект передачи данных, который представляет собой тонкую оболочку вокруг класса Car, эта упаковка может сериализовать идентификатор вместо ссылочного объекта, чтобы потребители могли получить Мать, если они захотят. У Dto есть другие преимущества, такие как поддержание постоянного интерфейса, в то время как базовые объекты домена могут меняться, чтобы лучше всего соответствовать базе кода.

+0

что вы имеете в виду под «Dto является хорошо что « –

+0

Обновлен ответ для вас. – vfilby

1

и выше изложенных выше причин, как насчет простой простоты использования? , если я хочу, чтобы пройти генеалогическое дерево, используя свой дизайн, код будет выглядеть примерно так:

 
Cat firstCat = //get starting cat somehow 
Object someBroker = //get a 3rd party broker (like an entity manager) 
Cat parent = broker.getCatById(firstCat.getParentId()); 

с использованием реальных ссылок на объекты в то время как более элегантно:

 
Cat firstCat = // get initial cat 
while ((Cat ancestor = firstCat.getParent)!=null) { 
    //work with ancestor 
} 

Смежные вопросы