使用@JoinTable 的 Hibernate 一对多映射问题

Hibernate One-To-Many Mapping issue using @JoinTable

我有两个 table:用户和团队

用户

团队

约束条件 1 个用户只能属于一个团队,而 1 个团队可以有多个用户。 我已经规范化了数据库,第三个 table()Join Table) named user_team 将如下所示:

User_Team[加入TABLE]

在 Hibernate 中使用@JoinColumn 属性和@OneToMany 注释实现它时抛出以下错误:

A Foreign key refering com.project.hibernate.Team from com.project.hibernate.User has the wrong number of column. should be 2

Exception in thread "main" org.hibernate.AnnotationException: A Foreign key refering com.project.hibernate.Team from com.project.hibernate.User has the wrong number of column. should be 2 at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:657) at org.hibernate.cfg.annotations.CollectionBinder.bindCollectionSecondPass(CollectionBinder.java:1610) at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1335) at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:800) at org.hibernate.cfg.annotations.CollectionBinder.secondPass(CollectionBinder.java:725) at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:54) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1621) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1589) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:278) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83) at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:418) at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:87) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:691) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:726) at com.project.hibernate.User_TeamDAO.main(User_TeamDAO.java:26)

您有一个包含两个字段的组合键:

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

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

而您的加入 table 每个 table 只有一个键:

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

您需要使用建立关系的所有键,诸如此类(当然 table 还需要有正确的列):

@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;