Разрешает ли спецификация JPA ссылки на столбцы без первичного ключа? - PullRequest
18 голосов
/ 28 апреля 2011

Разрешает ли спецификация JPA простые ссылки на столбцы не первичного ключа?

У меня есть простой столбец альтернативного / натурального ключа (UNIQUE, NOT NULL) iso_code в моей таблице стран, которую я хотел бы использоватьв ссылке, но Dali в Eclipse показывает ошибку проверки, а Hibernate генерирует исключение MappingException.

Разрешен ли такой распространенный сценарий?

Ответы [ 2 ]

9 голосов
/ 02 мая 2011

@ axtavt: Похоже, ваш ответ неверный.Я только что получил электронное письмо от авторов "Pro JPA 2.0", которые также сами работали над спецификацией JPA.

"В вашем примере класс Zip имеет отношение к стране:

public class Zip implements Serializable
{
    @Id
    @Column(name = "code")
    private String code;

    @Id
    @ManyToOne
    @JoinColumn(name = "country_code", referencedColumnName = "iso_code")
    private Country country = null;
    ...
}

Судя по всему, он пытается указать столбец внешнего ключа country_code на столбец iso_code в таблице Country, который не является PK. JPA никогда не разрешал вам создавать отношения, подобные этой потому что без указания PK страны не было бы способа однозначно определить, какой экземпляр страны находится в отношении. Вы просто сталкиваетесь с проблемой, когда добираетесь до части производного идентификатора, но проблема, по-видимому, заключается в самом недействительном отношении. "

Таким образом, спецификация JPA вообще не разрешает отношения / FK для столбцов без PK ...

7 голосов
/ 28 апреля 2011

Поддержка отношений, которые ссылаются на не-PK столбцы, является дополнительной функцией.В простых случаях он поддерживается Hibernate, но его нельзя использовать как часть идентификатора с использованием dervied.

Однако, пока вы не получаете идентификацию (то есть, если вы можете установить значение компонента первичного ключа вручную), вы можете попытаться поиграть с отображениями только для чтения, что-то вроде этого:

@Entity
@Table(name = "Zips")
@IdClass(value = ZipId.class)
public class Zip implements Serializable
{
    @Id
    @Column(name = "code")
    private String code;

    @Id
    @Column(name = "country_code")
    private String countryCode; // Primary key component should be set manually

    @ManyToOne
    @JoinColumn(name = "country_code", referencedColumnName = "iso_code", 
        insertable = false, updateable = false)
    private Country country = null; // Read-only relationship based on a value 
                                    // of primary key component

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