简体   繁体   English

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

[英]Hibernate One-To-Many Mapping issue using @JoinTable

I have two tables: User And Team我有两个表:用户和团队

User用户

  • UserId用户身份
  • 4 digit Password/pin 4 位密码/pin

Team团队

  • Team_id Team_id
  • TeamName队名

Constraints 1 user can only belong to one team whereas 1 team can have many users.约束1 个用户只能属于一个团队,而 1 个团队可以有多个用户。 I have already normalized the database and the third table()Join Table) named user_team will be as follows:我已经对数据库进行了规范化,名为 user_team 的第三个 table()Join Table) 将如下所示:

User_Team[JOIN TABLE] User_Team[加入表]

  • User_id(This is a Foreign Key from User Table) User_id(这是来自用户表的外键)
  • Team_Id(This is a Foreign Key from Team Table) Team_Id(这是团队表中的外键)

While implementing this in Hibernate using @JoinColumn Attribute and @OneToMany annotations its throwing following error:在 Hibernate 中使用 @JoinColumn Attribute 和 @OneToMany 注释实现这一点时,它抛出以下错误:

A Foreign key refering com.project.hibernate.Team from com.project.hibernate.User has the wrong number of column.从 com.project.hibernate.User 引用 com.project.hibernate.Team 的外键具有错误的列数。 should be 2应该是 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.线程“main” org.hibernate.AnnotationException 中的异常:从 com.project.hibernate.User 引用 com.project.hibernate.Team 的外键具有错误的列数。 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$1.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(MetadataBu应该是 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) at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:800) at org.hibernate.cfg.annotations.CollectionBinder)atCollectionBinder2.java:1335() 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:1621) 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) 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) ildingProcess.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)

You have a composed key containing two fields:您有一个包含两个字段的组合键:

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

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

Whereas your join table has only one key per table:而您的连接表每个表只有一个键:

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

You need to use all keys that make the relationship, something like that (of course table also need to have the right columns):您需要使用所有建立关系的键,类似的东西(当然表也需要有正确的列):

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM