проектирование классов и отображений гибернации - PullRequest
1 голос
/ 22 июля 2011

, просматривая код в некоторых книгах по гибернации, я заметил некоторые странные вещи о классах сущностей.Например, у Клиента есть Адрес. Отображение:

public class Customer implements Serializable {
    @Column (name="ID")
    @Id
    @GeneratedValue (strategy=GenerationType.AUTO)
    private Long id;

    @OneToOne (cascade=CascadeType.ALL)
    @JoinColumn (name="ADDRESS_ID")
    private Address address;

...
}

Теперь класс Адреса задан как

public class Address implements Serializable{
...
   @OneToOne (mappedBy="address")
   private Customer customer;
}

Это правильно? Должен ли Клиент быть полем Адреса? Это выглядит странно для меня. Конечно, это облегчает двунаправленную ассоциацию. Но, если бы я моделировал класс с именем Address, я бы не представил для него поле Customer (хотя мои знания / опыт в ООП ничтожны).

Что вы, ребята, думаете? .. Мне бы хотелось узнать мнение какого-то гуру объектно-ориентированного дизайна ..

искренне,

Джим

Ответы [ 3 ]

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

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

Лично в реальных системах я бы не рекомендовал делать адрес независимой сущностью ссвою собственную таблицу и склоняется к тому, чтобы сделать Address компонентом и включить его поля в Customer.В большинстве случаев вы не собираетесь управлять Адреса независимо от Клиентов (они будут использовать один и тот же жизненный цикл), и таким образом будет меньше соединений и меньше сложностей.

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

Это правильно? да

Должен ли клиент быть полем адреса? да

Для новичка, как говорит ваше сопоставление, класс Customer имеет определение:

private Address address;

Это определение является ссылкой на уровне класса на его относительный адрес,Затем он становится протоколом для режима гибернации, чтобы увидеть связь между Customer и Address.

Отображение в классе Address говорит: «У меня есть связь с классом Customer, моя ссылка там называется« адрес », поэтому при вызовеИз класса Customer сделан мне, он должен исходить из этой ссылки.

Обратите внимание, что это уровень класса.Затем Hibernate преобразует сопоставление в сопоставление таблицы с таблицей, используя внешний ключ адреса.

Пример, когда вы создаете нового клиента, например;

Customer customer = new Customer(..);
Address address = new Address(..);
customer.setAddress(address)

dao.save(address);
dao.save(customer);

Затем клиент будет иметь первичный ключАдрес сохранен и хранится как внешний ключ, отсюда и определение;

 @JoinColumn (name="ADDRESS_ID")
    private Address address;

Я думаю, что это базовое определение вашего вопроса. Подробнее о Hibernate One-to-One.

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

Зависит от того, нужен ли вам Клиент от объекта Address. Как правило, я бы не стал использовать его там, но если это имеет смысл для вашего случая использования, я бы не назвал его неправильным.

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