【问题标题】:OneToMany JoinTable with a non Primary Key value具有非主键值的 OneToMany JoinTable
【发布时间】:2012-01-11 18:48:04
【问题描述】:

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

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

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

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

但是将它们都作为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] 的目标实体。不使用泛型时,请确保在关系映射中定义了目标实体。

我的映射有什么问题?

【问题讨论】:

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


    【解决方案1】:

    User-to-Post 有两种关系,一种用于墙,一种用于作者身份:

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

    根据需要使用反向关系。

    例如:

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

    【讨论】:

    • 我知道,但我认为 Wall 不是常规实体。我的意思是,Wall 必须将来自 Post 的数据与来自 User 的数据连接起来,这就是我认为它是 JoinTable 的原因!有没有办法做我在我的问题中提出的问题?谢谢你的回复顺便说一句:)
    • 好点! :) 只是另一个问题..这不需要 Post 表中的新字段来同时具有作者和所有者吗?
    • @StepTNT 肯定会。它们是不同的关系,可能指向不同的 User 实例。
    猜你喜欢
    • 2013-09-28
    • 2021-10-07
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多