簡體   English   中英

休眠允許外鍵成為許多類之一嗎?

[英]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進行構建的內置方法,還是我必須構建自己的解決方案(我很樂意這樣做,所以我想先看看是否有具體的解決方案)。

有兩種方法,您可以僅使用超級實體 -繼承。

  1. 創建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 { ... } 
  2. 使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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM