Вопрос по orm, eclipselink, openjpa, hibernate, jpa – Для чего используется referencedColumnName в JPA?

57

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

Ваш Ответ

5   ответов
6
name attribute points to the column containing the asociation, i.e. column name of the foreign key referencedColumnName attribute points to the related column in asociated/referenced entity, i.e. column name of the primary key

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

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

Однако если ссылка на объект имеет PK, который охватывает несколько столбцов, порядок, в котором вы указываете@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")
    }
)
Real life example

Два запроса, сгенерированные Hibernate из одного и того же сопоставления таблицы соединений, оба без указанного столбца.Only the order of @JoinColumn annotations were changed.

/* 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 аннотаций. Порядок обоих целых чисел всегда один и тот же, вероятно, отсортированный по спящему режиму, и поэтомуproper alignment with join table columns is required and we can't or should rely on mapping order.

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

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

57

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")
35

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

Table Person
name char(64) primary key
age int

Table Car
car_registration char(32) primary key
car_brand (char 64)
car_model (char64)
owner_name char(64) foreign key references Person(name)

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

class Person{
   ...
}

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

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

19

API на referencedColumnName:

The name of the column referenced by this foreign key column.

Default (only applies if single join column is being used): The same name as the primary key column of the referenced table.

Q/A

Where this would be used?

When there is a composite PK in referenced table, затем вам нужно указать имя столбца, на который вы ссылаетесь.

Или в@ManyToMany отображение, когда у вас есть средний стол.
0

Похожие вопросы