#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. У меня этого нет. Это только для двунаправленных ассоциаций, нет? В любом случае, кажется, что мне удалось решить это с помощью собственных запросов, так что спасибо за ваше время! Также, извините за поздние ответы, но, похоже, у нас большая разница в наших часовых поясах, и я ложусь спать примерно в то время, когда вы отвечаете.