2

具有以下 SQL 表:

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:

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

@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

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

我正进入(状态

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 容器初始化阶段。

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

4

3 回答 3

4

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

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

@OneToMany(mappedBy="userPost.post")
private Set<UserPostRating> ratings = new HashSet<>();
于 2013-01-05T14:11:45.007 回答
2

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

 @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

于 2018-11-28T02:24:28.490 回答
1

根据我怀疑的错误消息,您必须移动定义

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

从课堂UserPostRating到课堂RatingId

于 2013-01-05T14:10:50.037 回答