JPA / Hibernate: «отсутствует столбец» при объединении столбцов - PullRequest
3 голосов
/ 16 января 2012

Я не очень знаком с JPA или Hibernate.Я беру на себя чужой код и просто пытаюсь заставить его работать прямо сейчас.Учитывая мое ограниченное понимание, я постараюсь быть как можно более конкретным, не утонув в ненужных деталях.

У меня есть исключение времени выполнения для "org.hibernate.HibernateException: отсутствует столбец: имя в public.sessions«.Вот основная организация этой части приложения:

@Entity
@Table(name = "sessions")
public class Session {
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name = "article_name",
            referencedColumnName = "article_name",
            insertable = false, updatable = false),
        @JoinColumn(name = "group_name",
            referencedColumnName = "name",
            insertable = false, updatable = false) })
    private Group group;

    ...
}

@Entity
@Table(name = "groups")
public class Group {
    ...
}

А вот соответствующие таблицы.Схема намного более сложна, чем эта (также не подлежит обсуждению - я не могу изменить нашу существующую базовую линию), но это соответствующие таблицы / столбцы.

sessions
--------
article_name
group_name
...


groups
--------
article_name
name
...

Как видите,имя столбца имени группы отличается в двух таблицах.Хотя я не очень разбираюсь в JPA, я подумал, что использование свойства "referencedColumnName" позволило учесть эту разницу при объединении двух столбцов с разными именами.Однако выполнение с этим кодом приводит к исключению «Отсутствует столбец: имя в public.sessions».Если я переключаю значения свойств «name» и «referencedColumnName» для второй аннотации @JoinColumn (в результате чего name = «name», referencedColumnName = «group_name»), я получаю исключение «org.hibernate.MappingException: невозможнонайдите столбец с логическим именем: group_name в группах. "

Я нашел довольно много примеров в Интернете, которые, кажется, делают нечто подобное, но по какой-то причине я не могу заставить это работать.Что бы это ни стоило, этот код работал нормально, но, как мы выяснили, это связано с тем, что Hibernate был настроен на обновление таблицы по мере необходимости (поэтому в таблицу сессий был добавлен столбец «имя»).Как только мы изменили свойство «hbm2ddl.auto» на «validate», мы начали получать эту ошибку.Из-за этого, я думаю, что проблема всегда существовала, мы просто не заметили ее, потому что добавлялся столбец.

Заранее спасибо за любую помощь.

1 Ответ

1 голос
/ 16 января 2012

referencedColumnName - это столбец в таблице group, на который ссылается внешний ключ.И поскольку у вас есть фактическое имя столбца в таблице group, то есть то, что используется в качестве внешнего ключа, равно "name".

Имеет смысл следующее:

@JoinColumn(name = "group_name",
            referencedColumnName = "name",

потому что тогда имя столбца внешнего ключа будет group_name, а имя столбца в таблице group, на которую есть ссылка (или которая используется в качестве внешнего ключа), будет name.Но когда вы меняете его, он не работает, потому что в вашей таблице group есть нет столбца с именем group_name.

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