我想知道是否可以很好地使用JPA映射常见实体。
对我来说,什么是常见的实体?假设我的许多域实体都有(一个)相关的图像。因此,会有像UserProfile -> Image
(个人资料图片)或Event ->* Image
这样的关系(宣传活动的图片,一对多)。
使用纯SQL,我可以有一个image
表,其中owner_id
列包含UserProfile#ID
或Event#ID
。因为我永远不必找到图像的所有者而是找到所有者的图像,我不在乎我不能立即判断图像5是个人物照片还是事件图像。
我想在JPA级别上,只要我没有Image
的一对多或多对一关系,同样的“黑客”就可以工作,因为他们需要一个后退参考对......是的,这就是问题所在。我无法创建该背引用。
唯一可行的方法是创建一个abstract Image
来保存所有常见的Image
字段,然后为每个关系创建一个具体的子类。有意义吗?
答案 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;
...
}