1

我正在尝试在 Java EE 中复制 Facebook 的墙。

我有 3 个表:用户、帖子、墙。

用户有一个用户名(PK)和其他字段,帖子有一个 id(PK),一个作者(用户上的 FK)和其他一些。Wall 是 Post 和 User 之间的连接表。

关键是,只有当我在 Wall 中将 post 和 user 都作为 PK 时,该项目才能编译。让 Post 拥有 PK 和 User 就像一个非空值是行不通的!

但是将它们都作为 PK 会导致@ManyToMany,这意味着同一个帖子可以在许多墙上,这是不正确的!

我尝试在 Wall 中发布为 PK 并使用此映射:

邮政:

@JoinTable(name = "Wall", joinColumns = {
    @JoinColumn(name = "id", referencedColumnName = "id")}, inverseJoinColumns = {
    @JoinColumn(name = "user", referencedColumnName = "username")})
@OneToMany
private User user;

用户:

@ManyToOne
private Collection<Post> onWall;

但它说:

无法确定类 [class entity.Post] 上的关系属性 [user] 的目标实体。不使用泛型时,确保在关系映射上定义目标实体。

我的映射有什么问题?

4

1 回答 1

1

用户到帖子的两种关系怎么样,一种用于墙,一种用于作者身份:

  • 用户一对多发布(贴在用户墙上的帖子,没有连接表),
  • 用户一对多发布(帖子的作者),

根据需要使用反向关系。

例如:

@Entity
public class User {
    @OneToMany(mappedBy="onWall")
    private Collection<Post> wall;

    // You can skip this relationship, if you don't want it
    @OneToMany(mappedBy="author")
    private Collection<Post> authoredPosts;
}

@Entity
public class Post {
    @ManyToOne
    @JoinColumn(name="wallOwnerId")
    private User onWall;

    @ManyToOne
    @JoinColumn(name="authorId")
    private User author;
}
于 2012-01-11T22:06:43.527 回答