Hibernate - одна проблема дизайна - PullRequest
1 голос
/ 12 марта 2010

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

Существует Cat код класса в 4.1. A simple POJO example.

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

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

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

private Cat mother;

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

private long motherId; 

`

Ответы [ 3 ]

4 голосов
/ 12 марта 2010

Это то, что Hibernate неявно делает для вас.

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

1 голос
/ 12 марта 2010

и по причинам, указанным выше, как насчет простой простоты использования? если я хочу пересмотреть семейное древо, используя ваш дизайн, код будет выглядеть примерно так 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
}
1 голос
/ 12 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...