[英]Hibernate allow foreign key to be one of many classes?
我正在嘗試在數據庫中實現主題標簽功能,從而允許將主題標簽分配給不同的類。 是否可以在標簽類中使用外鍵,使其成為許多不同類(文章,視頻,圖像)之一? 這意味着要有一個區分列。
例如
@Entity
@Table(name="tags")
public class Tags {
private String tagName; // the hashtag name; E.g cool-photo
private <Article, Video, Photo> relatedObject;
private String type; // Can either be Article, Video, Photo
}
在此示例中,我將能夠運行一個簡單的查詢:
select t.* from tags t where type = 'article' and tagName = 'tag-searching-for'
INNER JOIN Article a ON t.relatedObject = a.articleId;
這將為<type-requested>
返回一堆<type-requested>
對象(在本例中為article)!
是否有使用Hibernate進行構建的內置方法,還是我必須構建自己的解決方案(我很樂意這樣做,所以我想先看看是否有具體的解決方案)。
有兩種方法,您可以僅使用超級實體 -繼承。
創建Taggable
,這是Article,Video,...的新超級實體
@Entity public class Tag { private String tagName; // the hashtag name; Eg cool-photo @ManyToMany @JoinTable(...) private Set<Taggable> relatedObjects = new LinkedHashSet<>(); } @Entity @Inheritance(...) public abstract class Taggable { @ManyToMany(mappedBy = "relatedObjects") protected Set<Tag> tags = new LinkedHashSet<>(); } @Entity public class Article extends Taggable { ... }
使Tag
成為超級實體
@Entity @Inheritance(...) public abstract class Tag { protected String tagName; // the hashtag name; Eg cool-photo } @Entity public class ArticleTag extends Tag { @ManyToMany(mappedBy = "tags") private Set<Article> articles = new LinkedHashSet<>(); } @Entity public class Article { @ManyToMany @JoinTable(...) private Set<ArticleTag> tags = new LinkedHashSet<>(); }
在這兩種情況下,您可能會更頻繁地使用查詢(與您在示例中引入的查詢相反)類似於[JPQL樣式-不是SQL!]:
select a
from Article a
join a.tags t
where t.tagName = 'tag-searching-for'
獲取具有該特定tagName的所有文章。
恕我直言,第一個需要較少的重構和較少的樣板代碼,但是由於Java單類繼承限制,如果將來擴展模型時可能會引起一些問題。
附帶說明一下,我看不到使用單個relatedObject
的含義,因此我將其更改為Set<>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.