2016-01-11 2 views
0

Я уверен, что это дублированный вопрос, но я не могу заставить его работать. У меня есть отношение «один к нулю» или «один» с общим первичным ключом между объектом Home и объектом Address.Отсутствует столбец: идентификатор на взаимно однозначном сопоставлении с общим PK

Моя проблема заключается в том, что я получаю сообщение об ошибке

Missing колонок: идентификатор

Я отображающее свои объекты, как показано here, но разница, имя столбца для моего Address лица не называется id, но homeId_pf.

Вот мои объекты:

@Entity 
@Table(name = "homes") 
@Getter 
@Setter 
public class Home implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id", unique = true, nullable = false, updatable = false) 
    private Long id; 


    @OneToMany(fetch = EAGER, cascade = {ALL}, orphanRemoval = true) 
    @JoinColumn(name = "homeId_fk", referencedColumnName = "id", nullable = false) 
    private Set<Room> rooms = new HashSet<>(); 

    @OneToOne(fetch = EAGER, cascade = {ALL}) 
    @PrimaryKeyJoinColumn 
    private Address address; 

} 


@Entity 
@Table(name = "addresses") 
@Getter 
@Setter 
public class Address implements Serializable { 

    @Id 
    @Column(name = "homeId_pf") 
    private Long id; 

    private Integer city; 


    @MapsId 
    @OneToOne 
    @JoinColumn(name = "id") 
    private Home home; 
} 

Как сказал мой addresses таблица имеет два столбца: homeId_pf, который установлен в ПК и FK для homes.id и city.

Я также попытался установить @JoinColumn(name = "homeId_pf") на Address класс и @PrimaryKeyJoinColumn(referencedColumnName = "homeId_pf") на объект Home, но это не поможет.

+0

Возможно, дублированный вопрос: Помогает ли это? http://stackoverflow.com/questions/11938253/jpa-joincolumn-vs-mappedby –

ответ

0

Есть много проблем с один-к-одному ассоциаций, см

Проблема, как правило, что запрос Home.address.id =? заменяется на Home.id =? как если бы это был общий первичный ключ «один к одному» (вместо вашего «один к нулю» или «один»).

Hibernate делает ту же ошибку при работе с внешним ключом один к одному.

Вы выполняете критерии или запрос HQL? В разделе «Критерии» вы можете избежать проблемы с созданием псевдонима на Home.address и запросом alias.id. В HQL вы можете сделать подзапрос.

у меня не было времени, чтобы исправить ошибку в спящий режим, но если у вас есть тестовый пример, я думаю, что проблема исходит от этого кода в org.hibernate.engine.JoinHelper.getAliasedLHSColumnNames():

if (type.useLHSPrimaryKey()) { 
     return StringHelper.qualify(alias, lhsPersister.getIdentifierColumnNames()); 
    } 

Я думаю, он также должен проверить, что type.getLHSPropertyName() не заполняется атрибутом «свойство-ref» в XML-сопоставлении. Если у вас есть тестовый пример, было бы хорошо отправить вопрос в Hibernate и предложить исправить ошибку.