我正在尝试在数据库中实现主题标签功能,从而允许将主题标签分配给不同的类。是否可以在标签类中使用外键,使其成为许多不同类(文章,视频,图像)之一?这意味着要有一个区分列。

例如

@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>对象(在这种情况下为商品)!

是否有使用Hibernate进行构建的内置方法,还是我必须构建自己的解决方案(我很乐意这样做,所以我想先看看是否有具体的解决方案)。

最佳答案

有两种方法,您可以仅使用超级实体-继承。


创建Taggable,这是文章,视频等的新超级实体。

@Entity
public class Tag
{
    private String tagName; // the hashtag name; E.g 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; E.g 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<>

关于mysql - Hibernate允许外键成为许多类之一?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39197244/

10-14 19:45