【问题标题】:How to map common entity如何映射公共实体
【发布时间】:2011-10-07 23:26:12
【问题描述】:

我想知道是否可以用 JPA 很好地映射公共实体。

什么是我的共同实体?假设我的许多域实体都有(一个)关联图像。因此,会有UserProfile -> Image(个人资料图片)或Event ->* Image(宣传活动的图片,一对多)之类的关系。

使用纯 SQL,我可以有一个 image 表,其中一个 owner_id 列包含 UserProfile#IDEvent#ID。由于我永远不需要找到图像的所有者,而是将图像找到所有者,因此我不在乎我无法立即判断图像 5 是个人资料图片还是活动图片。

我猜在 JPA 级别上,只要我没有与 Image 的一对多或多对一关系,相同的“hack”就可以工作,因为它们需要反向引用。 ..是的,这就是问题所在。我无法创建该反向引用。

想到的唯一可行的方法是创建一个abstract Image 来保存所有常见的Image 字段,然后为每个关系创建一个具体的子类。有意义吗?

【问题讨论】:

    标签: orm jpa mapping


    【解决方案1】:

    我不太明白你的“纯 SQL”方法是如何工作的:如果你想获得 Event #5 的图像,你也会获得 UserProfile #5 的图像,对吧?

    对此建模的另一种方法是引入连接表。

    您可以为每种类型的图像所有者创建正常的连接表,并使用所有者和其中的图像的外键:

    @Entity
    public class UserProfile {
        @OneToOne @JoinTable
        private Image image;
        ...
    }
    
    @Entity
    public class Event {
        @OneToMany // Unidirectional one-to-many uses join table by default
        private List<Image> image;
        ...
    }
    

    或者,您可以创建一个仅包含主键的附加表:

    @Entity
    public class Images {
        @OneToMany @JoinColumn
        private List<Image> images;
        ...
    }
    
    @Entity
    public class UserProfile {
        @OneToOne
        private Images images;
        ...
    }
    

    【讨论】:

    • “我不太明白你的“纯 SQL”方法是如何工作的:如果你想获得事件 #5 的图像,你也会获得 UserProfile #5 的图像,对吧?啊,对了,忘了提到我们使用系统范围内唯一的 ID。
    • 对于UserProfile -&gt; Image 的情况,我最终使用了反向的一对一关系(即图像ID 作为外键存储在user_profile 表中)。
    猜你喜欢
    • 2011-10-20
    • 2020-12-06
    • 1970-01-01
    • 2015-10-30
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    相关资源
    最近更新 更多