首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >org.hibernate.MappingException:外键XXX必须与引用的主键YYY具有相同的列数

org.hibernate.MappingException:外键XXX必须与引用的主键YYY具有相同的列数
EN

Stack Overflow用户
提问于 2013-01-05 21:52:41
回答 3查看 11.2K关注 0票数 1

具有以下SQL表:

代码语言:javascript
代码运行次数:0
运行
复制
create table users_posts_ratings_map (
  postId integer not null references posts (id),
  userId integer not null references users (id),
  ratingId integer not null references ratings (id),
  primary key (postId, userId)
);

以及以下带JPA注释的POJO:

RatingId.java:

代码语言:javascript
代码运行次数:0
运行
复制
@Embeddable
public class RatingId implements Serializable {
    @ManyToOne
    @JoinColumn(name = "userId")
    private User user;

    @ManyToOne
    @JoinColumn(name = "postId")
    private Post post;

    // getters and setters
}

UserPostRating.java:

代码语言:javascript
代码运行次数:0
运行
复制
@Entity(name = "users_posts_ratings_map")
public class UserPostRating {
    @EmbeddedId
    private RatingId userPost;

    @OneToOne
    @JoinColumn(name = "ratingId")
    private Rating rating;

    // getters and setters
}

Post.java

代码语言:javascript
代码运行次数:0
运行
复制
@Entity(name = "posts")
public class Post {
    @Id
    @Column(nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    // irrelevant fields

    @ManyToMany
    @JoinTable(
            name = "users_posts_ratings_map",
            joinColumns = { @JoinColumn(name = "ratingId") },
            inverseJoinColumns = { @JoinColumn(name = "postId"), @JoinColumn(name = "userId") }
    )
    private Set<UserPostRating> ratings = new HashSet<>();

    // getters and setters
}

我得到了

代码语言:javascript
代码运行次数:0
运行
复制
org.hibernate.MappingException: Foreign key (FKB278E73083D94769:users_posts_ratings_map [postId,userId])) must have same number of columns as the referenced primary key (users_posts_ratings_map [ratingId,postId,userId])

在servlet容器初始化阶段。

这意味着什么(这个映射中的外键是什么?什么是主键?哪些注释标记了什么?)以及如何修复它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-05 22:11:45

这种映射没有多大意义。您有一个映射到users_posts_ratings_map的实体UserPostRating,并且与实体Post具有ManyToOne关联。

Post中,您有一组UserPostRating,但是您将其映射为第二个关联,并使其成为ManyToMany。它不是ManyToMany。这是一个OneToMany,因为另一端是ManyToOne。由于双向关联已经在UserPostRating中映射,因此您不能在Post中第二次映射它。所以代码应该是:

代码语言:javascript
代码运行次数:0
运行
复制
@OneToMany(mappedBy="userPost.post")
private Set<UserPostRating> ratings = new HashSet<>();
票数 4
EN

Stack Overflow用户

发布于 2018-11-28 10:24:28

映射是正确的,因为它是多对多的映射,所以它的映射将导致新的表。因此,您不应该引用现有实体表,而应该提供映射/实体名称不存在的任何其他名称。以下是您的示例:

代码语言:javascript
代码运行次数:0
运行
复制
 @ManyToMany
    @JoinTable(
            name = "users_posts_ratings_map",
            joinColumns = { @JoinColumn(name = "ratingId") },
            inverseJoinColumns = { @JoinColumn(name = "postId"), @JoinColumn(name = "userId") }
    )
    private Set<UserPostRating> ratings = new HashSet<>();

将名称从 "users_posts_ratings_map"更改为任何其他名称,如users_posts_ratings_map1users_posts_ratings_map_item

票数 2
EN

Stack Overflow用户

发布于 2013-01-05 22:10:50

根据我怀疑的错误消息,您必须将

代码语言:javascript
代码运行次数:0
运行
复制
@OneToOne
@JoinColumn(name = "ratingId")
private Rating rating;

从类UserPostRating到类RatingId

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14172401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档