Однонаправленная связь «один ко многим» JPA «У внешнего ключа, ссылающегося на [объект], неправильный номер столбца»

#hibernate #jakarta-ee #jpa #foreign-keys #one-to-many

#переход в спящий режим #джакарта-ee #jpa #внешние ключи #один ко многим

Вопрос:

У меня есть эти две таблицы:

Таблица рабочего места:

  • Идентификатор пользователя — первичный ключ, внешний ключ
  • организация — первичный ключ, внешний ключ
  • единица измерения — первичный ключ, внешний ключ
  • //другие не относящиеся к делу поля (номер, статус и т.д.)

Таблица пользователей:

  • Идентификатор пользователя — первичный ключ
  • //другие не относящиеся к делу поля (пол, электронная почта и т.д.)

Как показано в приведенных выше таблицах, у меня много пользователей, и у каждого пользователя есть одно рабочее место. У пользователя нет ссылки на рабочее место (как это должно быть после некоторого чтения), но на рабочем месте есть ссылки на пользователей. Я не могу изменить дизайн базы данных, поэтому я должен заставить ее работать следующим образом. Итак, чтобы сопоставить это, у меня есть следующий код в моем объекте workplace:

 @OneToMany//(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name="userId")
private Set<User> users;
  

Атрибут столбца join является идентификатором внешнего ключа пользователей в таблице WorkPlace. Из-за этого я получаю следующую ошибку:

 "A Foreign key refering hu.danubius.doclams.be.entity.org.UsersWork from hu.danubius.doclams.be.entity.org.User has the wrong number of column. should be 3"
  

Я понимаю, что программе необходимо ссылаться на первичный ключ объекта WorkPlace, но я не понимаю, почему или как я мог бы это решить. Что я упускаю?

Заранее спасибо за помощь!

Комментарии:

1. Что такое UsersWork и как это связано с пользователями и рабочим местом?

2. О, извините, я не был ясен. UsersWork — это объект WorkPlace.

Ответ №1:

Пример его использования см. в Java EE 6 API на JoinColumn .

Поскольку вы не показали все части объекта и соответствующую структуру базы данных, я могу только догадываться, что вы не используете правильный столбец базы данных для сопоставления — userId действительно ли имя столбца в таблице содержит идентификатор пользователя?

Комментарии:

1. Я не уверен, что я вполне понимаю, о чем вы говорите. Объект User имеет только простой первичный ключ (userId), и это поле, на которое ссылается таблица WorkPlace (объект UsersWork — извините за путаницу).

2. Да, это «к сожалению»… Я просто собираюсь использовать собственные запросы и не буду использовать ассоциации.

3. @Tsohun: у вас есть сопоставление «многие к одному» в пользовательском объекте? Предоставьте код, иначе мы не сможем помочь…

4. У меня этого нет. Это только для двунаправленных ассоциаций, нет? В любом случае, кажется, что мне удалось решить это с помощью собственных запросов, так что спасибо за ваше время! Также, извините за поздние ответы, но, похоже, у нас большая разница в наших часовых поясах, и я ложусь спать примерно в то время, когда вы отвечаете.