2015-04-16 7 views
0

У меня есть бэкэнд Spring Data Spring, использующий Hibernate в качестве реализации ORM.JPA - отношение @OneToOne для поля непервичного ключа не работает

Это модель:

__________  _________________________ 
|Person |  |MailConfig    | 
|________|  |_______________________| 
| id PK |  | uid PK-FK(Person.uid) | 
| uid |  | ...     | 
| ... |  |      | 
|________|  |_______________________| 

@Entity 
@Table(name="Person") 
public class PersonEntity{ 

    @Id 
    private String id; 

    private String uid; 

    @OneToOne(mappedBy="id", fetch=FetchType.EAGER) 
    private MailConfigEntity mailConfigNotes; 

    ... 
} 

@Entity 
@Table(name="MailConfig") 
public class MailConfigEntity implements Serializable{ 

    @Id 
    @OneToOne 
    @JoinColumn(name="uid", table="Person", referencedColumnName="uid", insertable = false, updatable = false) 
    private PersonEntity id; 

    ... 
} 

Person таблица соединяется с MailConfig таблицы через поле, которое не является первичным ключом персоны. Когда я загружаю объект с использованием personDAO.findOne(id), я могу видеть, что соединение в запросе выполняется против person.id вместо person.uid (on personent0_.id=mailconfig2_.uid). Любая идея, почему это не работает?

журнал запросов:

select 
     personent0_.id as id8_2_, 
     personent0_.uid as uid8_2_, 
     mailconfig2_.uid as uid5_1_ 
    from 
     Person personent0_ 
    left outer join 
     mailconfig mailconfig2_ 
      on personent0_.id=mailconfig2_.uid 
    where 
     personent0_.id=? 

ответ

0

В соответствии с документацией, проверьте, является ли это внешний ключ

Есть три случая для один-к-одному ассоциаций: либо связанные объекты совместно те же значения первичных ключей, внешний ключ принадлежит одному из сущностей (обратите внимание, что этот столбец FK в базе данных должен быть ограничен уникальным для имитации взаимно однозначного совпадения ) или вкладку ассоциации le используется для хранения ссылки между двумя объектами (для каждого fk необходимо определить уникальное ограничение, чтобы обеспечить однозначную множественность).

Также JoinColumn должен быть владельцем стороны отношений

+0

Итак ... Вы имеете в виду, что OneToOne ассоциация не поддерживает вступление в несырьевой клавише? – codependent

+0

@WornOutSoles - да, я верю в это, вы можете проверить документацию относительно аннотации oneToOne: https://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/ – mel3kings

+0

Я не согласен, кажется, поддерживается , Из документации, которую вы связали, раздел 2.2.5.1. Один-к-одному: 'Обратите внимание, что при использовании ссылочного столбца ColumnName в столбце не первичного ключа связанный класс должен быть Serializable. Также обратите внимание, что ссылочное имяColumnName в столбец не первичного ключа должно быть сопоставлено с свойством, имеющим один столбец (другие случаи могут не работать). – codependent

Смежные вопросы