具有非主键值的OneToMany JoinTable

时间:2012-01-11 18:48:05

标签: java-ee many-to-many one-to-many many-to-one jointable

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

我有3张桌子: 用户,帖子,墙。

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

关键是,只有我在Wall中将帖子和用户都用作PK时,项目才会编译。 让Post具有PK和User就像非空值一样不起作用!

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

我尝试在Wall中使用Post作为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]的目标实体。不使用泛型时,请确保在关系映射中定义目标实体。

我的地图有什么问题?

1 个答案:

答案 0 :(得分: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;
}