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

问题描述 投票:0回答:1

我有两个表:用户和团队

用户

  • 用户身份
  • 4位密码/密码

球队

  • TEAM_ID
  • 队名

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

User_Team [加入表]

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

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

从com.project.hibernate.User引用com.project.hibernate.Team的外键具有错误的列数。应该是2

线程“main”中的异常org.hibernate.AnnotationException:从com.project.hibernate.User引用com.project.hibernate.Team的外键具有错误的列数。应该是org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:657)中的org.hibernate.cfg.annotations.CollectionBinder.bindCollectionSecondPass(CollectionBinder.java:1610)org.hibernate.cfg.annotations中的2。 CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1335)位于org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:800)org.hibernate.cfg.annotations.CollectionBinder $ 1.secondPass(CollectionBinder.java:725)at at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:54)org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1621)atg.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(MetadataBu) ildingProcess.java:83)org.hibernate.cfg上的org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:418)org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:87)位于com.project.hibernate.User_TeamDAO.main(User_TeamDAO.java:26)的org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:726)中的.Configuration.buildSessionFactory(Configuration.java:691)

mysql spring hibernate jpa spring-data-jpa
1个回答
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;
© www.soinside.com 2019 - 2024. All rights reserved.