使用@JoinTable休眠一对多映射问题

时间:2019-02-20 14:53:13

标签: mysql spring hibernate jpa spring-data-jpa

我有两个表:用户和团队

用户

  • UserId
  • 4位数字的密码/密码

团队

  • Team_id
  • 团队名称

约束 1个用户只能属于一个团队,而1个团队可以有多个用户。 我已经规范化了数据库,名为user_team的第三个table()联接表将如下所示:

User_Team [JOIN TABLE]

  • User_id(这是用户表中的外键)
  • Team_Id(这是来自团队表的外键)

在Hibernate中使用@JoinColumn属性和@OneToMany注释实现此操作时,会引发以下错误:

  

一个外键,引用来自com.project.hibernate.Team   com.project.hibernate.User的列数错误。应该是2

     

线程“ main” org.hibernate.AnnotationException中的异常:A   引用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.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1335)   在   org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:800)   在   org.hibernate.cfg.annotations.CollectionBinder $ 1.secondPass(CollectionBinder.java:725)   在   org.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(MetadataBuildingProcess.java:83)   在   org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:418)   在   org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:87)   在   org.hibernate.cfg.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 :(得分:1)

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

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