Однонаправленные отношения один-к-одному с общим первичным ключом и @OneToOne на дочерней стороне - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть объект Appliance следующим образом:

public class Appliance {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    // other appliance fields
 }

Затем у меня есть другой класс, который используется для сопоставления стороннего устройства с устройством:

public class ThirdPartyApplianceMapping {

    @Id
    private Long applianceId;

    private Long thirdPartyApplianceId;

    @OneToOne
    @JoinColumn(name="applianceId", nullable=false)
    private Appliance appliance;

 }

Я хочубаза данных, которая должна быть структурирована как:

Appliance(
     id PK,
     -- other columns but no col reference to ThirdPartyApplianceMapping
)

ThirdPartyApplianceMapping(
     applianceId PK FK references Appliance.id,
     thirdPartyApplianceId
)

Как я могу определить / аннотировать мои сущности так, чтобы ThirdPartyApplianceMapping.applianceId представлял собой PK и FK обратно к Appliance.id?Appliance не должен знать о ThirdPartyApplianceMapping.Я использую реализацию JPA 2 в Hibernate.

Ответы [ 2 ]

0 голосов
/ 31 марта 2019

Это можно сделать с помощью MapsId :

Обозначает атрибут отношения ManyToOne или OneToOne, который обеспечивает сопоставление для первичного ключа EmbeddedId, атрибута в EmbeddedIdпервичный ключ или простой первичный ключ родительского объекта.

В этом случае appliance должен быть аннотирован MapsId:

@OneToOne
@JoinColumn(name="applianceId")
@MapsId
private Appliance appliance;

Также nullable=false былотброшено, потому что по определению первичный ключ не имеет значения nullable.

0 голосов
/ 28 февраля 2019

Аннотацию @Id или атрибут XML id можно добавить в отображение OneToOne или ManyToOne.Идентификатор, используемый для объекта, будет получен из идентификатора целевого объекта.Если идентификатор представляет собой одно значение, то идентификатор исходного объекта совпадает с идентификатором целевого объекта.

Источник: вики-книги

Так что для вашего случаяэто должно сделать это:

public class ThirdPartyApplianceMapping {

    private Long thirdPartyApplianceId;

    @Id
    @OneToOne
    @JoinColumn(name="applianceId", nullable=false)
    private Appliance appliance;

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