Hibernate One-to-Many Mapping проблема с использованием @JoinTable - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть две таблицы: пользователь и команда

пользователь

  • идентификатор пользователя
  • 4-значный пароль / пин-код

Team

  • Team_id
  • TeamName

Ограничения 1 пользователь может принадлежать толькоодна команда, тогда как у одной команды может быть много пользователей.Я уже нормализовал базу данных, и третья таблица () Join Table) с именем user_team будет выглядеть следующим образом:

User_Team [JOIN TABLE]

  • User_id (Это внешний ключ из пользовательской таблицы)
  • Team_Id (это внешний ключ из командной таблицы)

При реализации этого в Hibernate с помощью атрибутов @JoinColumn и @OneToMany анонсируется его выдачаследующая ошибка:

Внешний ключ, ссылающийся на com.project.hibernate.Team из com.project.hibernate.User, имеет неправильный номер столбца.должно быть 2

Исключение в потоке "main" org.hibernate.AnnotationException: внешний ключ, ссылающийся на com.project.hibernate.Team из com.project.hibernate.User, имеет неправильный номер столбца.должно быть 2 в org.hibernate.cfg.annotations.TableBinder.bindFk (TableBinder.java:657) в org.hibernate.cfg.annotations.CollectionBinder.bindCollectionSecondPass (CollectionBinder.java:1610) в org.hibernate.cfg.antationsCollectionBinder.bindManyToManySecondPass (CollectionBinder.java:1335) в org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass (CollectionBinder.java:800) в org.hibernate.cfg.annotations.Caveg.annotations.7org.hibernate.cfg.CollectionSecondPass.doSecondPass (CollectionSecondPass.java:54) при org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses (InFlightMetadataCollectorImpl.java:1621) в org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses (InFlightMetadataCollectorImpl.Java: 1589) в org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete (MetadataBuildingProcess.java:278) в org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build (MetadataildingProcess.java:83) в org.hibernate.boot.internal.MetadataBuilderImpl.build (MetadataBuilderImpl.java:418) в org.hibernate.boot.internal.MetadataBuilderImpl.build (Metadatalg.jb87: org.jpg).Configuration.buildSessionFactory (Configuration.java:691) в org.hibernate.cfg.Configuration.buildSessionFactory (Configuration.java:726) в com.project.hibernate.User_TeamDAO.main (User_TeamDAO.java:26)

1 Ответ

0 голосов
/ 20 февраля 2019

У вас есть составной ключ, содержащий два поля:

@Id
@Column(name="team_id")
private String team_id;

@Id
@Column(name="team_name")
private String team_name;

В то время как ваша таблица соединения имеет только один ключ на таблицу:

@OneToMany(cascade=CascadeType.ALL)
@JoinTable(name="user_team",
        joinColumns=@JoinColumn(name="team_id"),
        inverseJoinColumns=@JoinColumn(name="user_id"))
private List<User> user;

Вам необходимо использовать все ключи, которые делаютотношения, что-то в этом роде (конечно, в таблице также должны быть правильные столбцы):

@OneToMany(cascade=CascadeType.ALL)
@JoinTable(name="user_team",
        joinColumns=@JoinColumn({@JoinColumn(name="team_id"), @JoinColumn(name="team_name")}),
        inverseJoinColumns=@JoinColumn(name="user_id"))
private List<User> user;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...