使用@JoinTable 的 Hibernate 一对多映射问题
Hibernate One-To-Many Mapping issue using @JoinTable
我有两个 table:用户和团队
用户
- 用户名
- 4位数Password/pin
团队
- Team_id
- 团队名称
约束条件
1 个用户只能属于一个团队,而 1 个团队可以有多个用户。
我已经规范化了数据库,第三个 table()Join Table) named user_team 将如下所示:
User_Team[加入TABLE]
- User_id(这是来自用户 Table 的外键)
- Team_Id(这是团队 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;
我有两个 table:用户和团队
用户
- 用户名
- 4位数Password/pin
团队
- Team_id
- 团队名称
约束条件 1 个用户只能属于一个团队,而 1 个团队可以有多个用户。 我已经规范化了数据库,第三个 table()Join Table) named user_team 将如下所示:
User_Team[加入TABLE]
- User_id(这是来自用户 Table 的外键)
- Team_Id(这是团队 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;