Что называется ссылочным именем ColumnName, используемым в JPA?

В JPA есть атрибут @JoinColumn, @PrimaryKeyJoinColumn который можно установить на @JoinColumn, @PrimaryKeyJoinColumn какова идея этой настройки, может ли кто-нибудь дать хороший пример того, где это можно использовать?

Он должен указать другой столбец как столбец id по умолчанию для другой таблицы, например, рассмотреть следующие

 TableA id int identity tableb_key varchar TableB id int identity key varchar unique // in class for TableA @JoinColumn(name="tableb_key", referencedColumnName="key") 

Свойство referedColumnName – это имя столбца таблицы, в котором вы ссылаетесь на колонку, которую вы анонтируете. Или кратко: это столбец, на который ссылается таблица назначения. Представьте себе что-то вроде этого: машины и люди. У одного человека может быть много автомобилей, но один автомобиль принадлежит только одному человеку (извините, мне не нравится, что кто-то еще водит мою машину).

Персонал таблицы
имя char (64) первичный ключ
возраст int

Настольный автомобиль
car_registration char (32) первичный ключ
car_brand (char 64)
car_model (char64)
owner_name char (64) ссылки на foreign keys Person (name)

Когда вы реализуете classы, у вас будет что-то вроде

 class Person{ ... } class Car{ ... @ManyToOne @JoinColumn(columnName="owner_name", referencedColumnName="name") private Person owner; } 

Надеюсь это поможет.

Quoting API для ссылочного имени столбца:

Имя столбца, на которое ссылается этот столбец внешнего ключа.

Значение по умолчанию (применяется только в том случае, если используется столбец с одним соединением): то же имя, что и столбец первичного ключа в указанной таблице.

Q /

Где это будет использоваться?

Когда в таблице ссылок имеется составная таблица PK , вам нужно указать имя столбца, на которое вы ссылаетесь.

  • атрибут name указывает на столбец, содержащий асоциацию, то есть имя столбца внешнего ключа
  • referedColumnName указывает на соответствующий столбец в объекте asociated / referenced, то есть имя столбца первичного ключа

Вы не обязаны заполнять referencedColumnName имя столбца, если ссылочный объект имеет один столбец как PK, потому что нет сомнений в том, какой столбец он ссылается (например, идентификатор одного столбца Address ).

 @ManyToOne @JoinColumn(name="ADDR_ID") public Address getAddress() { return address; } 

Однако, если ссылочный объект имеет PK, который охватывает несколько столбцов, порядок, в котором вы указываете annotations @JoinColumn имеет значение. Он может работать без referencedColumnName указанного имени столбца, но это просто удача. Таким образом, вы должны сопоставить это следующим образом:

 @ManyToOne @JoinColumns({ @JoinColumn(name="ADDR_ID", referencedColumnName="ID"), @JoinColumn(name="ADDR_ZIP", referencedColumnName="ZIP") }) public Address getAddress() { return address; } 

или в случае ManyToMany :

 @ManyToMany @JoinTable( name="CUST_ADDR", joinColumns= @JoinColumn(name="CUST_ID"), inverseJoinColumns={ @JoinColumn(name="ADDR_ID", referencedColumnName="ID"), @JoinColumn(name="ADDR_ZIP", referencedColumnName="ZIP") } ) 

Пример реальной жизни

Два запроса, сгенерированные Hibernate из одного и того же сопоставления таблицы соединений, оба без указанного столбца указаны. @JoinColumn только порядок аннотаций @JoinColumn .

 /* load collection Client.emails */ select emails0_.id_client as id1_18_1_, emails0_.rev as rev18_1_, emails0_.id_email as id3_1_, email1_.id_email as id1_6_0_ from client_email emails0_ inner join email email1_ on emails0_.id_email=email1_.id_email where emails0_.id_client='2' and emails0_.rev='18' 
 /* load collection Client.emails */ select emails0_.rev as rev18_1_, emails0_.id_client as id2_18_1_, emails0_.id_email as id3_1_, email1_.id_email as id1_6_0_ from client_email emails0_ inner join email email1_ on emails0_.id_email=email1_.id_email where emails0_.rev='2' and emails0_.id_client='18' 

Мы запрашиваем таблицу соединений, чтобы получить электронные письма клиентов. {2, 18} – это составной идентификатор клиента. Порядок имен столбцов определяется вашим порядком аннотаций @JoinColumn . Порядок обоих целых чисел всегда один и тот же, вероятно, отсортированный по спящему режиму, поэтому требуется правильное выравнивание с столбцами таблицы соединений, и мы не можем или не должны полагаться на порядок сопоставления.

Интересно то, что порядок целых чисел не соответствует порядку, в котором они отображаются в сущности – в этом случае я ожидал бы {18, 2} . Поэтому кажется, что Hibernate сортирует имена столбцов, прежде чем использовать их в запросе. Если это верно, и вы должны будете упорядочить свой @JoinColumn же, как вам не нужно referencedColumnName @JoinColumn , но я говорю это только для иллюстрации.

Правильно заполненные referencedColumnName атрибутыColumnName id_client = 18 точно такой же запрос без двусмысленности, в моем случае второй запрос ( rev = 2 , id_client = 18 ).

Для использования примера JPA 2.x для общего случая двух таблиц с однонаправленным объединением @OneToMany см. https://en.wikibooks.org/wiki/Java_Persistence/OneToMany#Example_of_a_JPA_2.x_unidirectional_OneToMany_relationship_annotations

Снимок экрана из этой статьи WikiBooks JPA: пример однонаправленной базы данных отношений OneToMany от JPA 2.x

  • Когда Hibernate сбрасывает сеанс, как он решает, какие объекты в сеансе загрязнены?
  • Что используется session.flush () в Hibernate
  • Hibernate: MyInterceptor # onFlushDirty никогда не вызывается
  • Лучшие бесплатные инструменты ORM для использования с .NET 2.0 / 3.5
  • Классы classов Hibernate должны быть Serializable?
  • Нужны ли мне элементы в файле persistence.xml?
  • Entity Framework .Remove () vs. .DeleteObject ()
  • Примитив или shell для первичных ключей спящего режима
  • Entity Framework Code First - два внешних ключа из одной таблицы
  • Как использовать Hibernate @ Любые связанные annotations?
  • Postgresql UUID поддерживается Hibernate?
  • Interesting Posts
    Давайте будем гением компьютера.