Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Direction in Entity Relationships


Автор: Chupakabr 8.7.2010, 13:06
Всем привет.
Начал читать туториал по JPA  и наткнулся на сабж. Собственно, у меня несколько вопросов:
  • Зачем вообще нужна эта направленность?
  • Почему туториал противоречит сам себе? А точнее, вот определение двусторонней связи и правил которым она должна следовать:
    Цитата

    In a bidirectional relationship, each entity has a relationship field or property that refers to the
    other entity. [...]

    Bidirectional relationships must follow these rules: [...]

    For one-to-one bidirectional relationships, the owning side corresponds to the side that
    contains the corresponding foreign key.

    Выходит, что с одной стороны двусторонней является связь при которой обе сущности "знают" друг о друге (то есть имеют ссылки одна на другую), а с другой стороны при ассоциации OneTone владеющей сущностью является та,  в которой присутствует внешний ключ. Вот пример, приведённый в API для связи OneToOne:
    Код

        On Customer class:

        @OneToOne(optional=false)                  //зачем нужен элемент optional я так и не въехал...
        @JoinColumn(name="CUSTREC_ID", unique=true, nullable=false, updatable=false)  //зачем это надо?
        public CustomerRecord getCustomerRecord() { return customerRecord; }

        On CustomerRecord class:

        @OneToOne(optional=false, mappedBy="customerRecord")   //почему эта сущность является обратной?
        public Customer getCustomer() { return customer; }


    Что-то тут не так, либо я неправильно понял...
  • И последнее. Как происходит отображение ссылок в базу данных? Приведу пример
    Код

    @Entity
    Customer {
        @OneToMany(mappedBy=customer)
        private Set <Order> orders;
    }

    @Entity
    Order {
        @ManyToOne
        private Customer customer;
    }

    В этом случае в обоих таблицах представляющих сущности создаются колонки с внешними ключами указывающими на первичные ключи соответствующей сущности, или как?
    А если мы имеем тип ассоциации ManyToMany? В таком случае, насколько я знаю, не всегда удается обойтись двумя таблицами...
Заранее, спасибо.

Автор: AJetman 8.7.2010, 14:02
Цитата(Chupakabr @  8.7.2010,  13:06 Найти цитируемый пост)
В этом случае в обоих таблицах представляющих сущности создаются колонки с внешними ключами указывающими на первичные ключи соответствующей сущности, или как?
 Именно. 

Рекомендую создать пробный проект и с включенной ddl и отображением sql-запросов в вашем jpa-провайдере посмотреть на практике, что и как создается.

Цитата(Chupakabr @  8.7.2010,  13:06 Найти цитируемый пост)
//зачем нужен элемент optional я так и не въехал...
 С optional (может быть и в аннотации @Basic), если JPA-провайдер поддерживает, последний производит валидацию сущности перед  сохранением. Такой же эффект, в принципе, можно получить и с помощью @Column и @JoinColumn nullable.


Цитата(Chupakabr @  8.7.2010,  13:06 Найти цитируемый пост)
В этом случае в обоих таблицах представляющих сущности создаются колонки с внешними ключами указывающими на первичные ключи соответствующей сущности, или как?
 Только в Order будет создано поле с первичным ключом Customer.

Автор: Chupakabr 8.7.2010, 15:02
Цитата(AJetman @  8.7.2010,  14:02 Найти цитируемый пост)
С optional (может быть и в аннотации @Basic), если JPA-провайдер поддерживает, последний производит валидацию сущности перед  сохранением.


В каком смысле валидацию?

Ещё такой вопрос: jpa-провайдер это что-то наподобие JDBC-провайдера?

Автор: AJetman 8.7.2010, 17:26
Цитата(Chupakabr @  8.7.2010,  15:02 Найти цитируемый пост)
Ещё такой вопрос: jpa-провайдер это что-то наподобие JDBC-провайдера?
 Нет, под JPA-провайдером имею в виду реализацию JPA 1.0 или 2.0 в виде Hibernate EntityManager, EclipseLink, OpenJPA и DataNucleus.

Цитата(Chupakabr @  8.7.2010,  15:02 Найти цитируемый пост)
В каком смысле валидацию?
 Валидацию на то, что полю присвоено какое-то значение, а не оставлено как null.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)