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