如何映射普通实体

时间:2011-07-18 19:32:26

标签: orm jpa mapping

我想知道是否可以很好地使用JPA映射常见实体。

对我来说,什么是常见的实体?假设我的许多域实体都有(一个)相关的图像。因此,会有像UserProfile -> Image(个人资料图片)或Event ->* Image这样的关系(宣传活动的图片,一对多)。

使用纯SQL,我可以有一个image表,其中owner_id列包含UserProfile#IDEvent#ID。因为我永远不必找到图像的所有者而是找到所有者的图像,我不在乎我不能立即判断图像5是个人物照片还是事件图像。

我想在JPA级别上,只要我没有Image的一对多或多对一关系,同样的“黑客”就可以工作,因为他们需要一个后退参考对......是的,这就是问题所在。我无法创建该背引用。

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

1 个答案:

答案 0 :(得分:0)

我不太明白你的“纯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;
    ...
}