首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA多态oneToMany

JPA多态oneToMany
EN

Stack Overflow用户
提问于 2010-05-27 00:38:07
回答 4查看 3.5K关注 0票数 5

我不知道如何用JPA干净利落地创建一个标签云,其中每个数据库实体都可以有许多标签。

E.g

帖子可以有0个或多个标签用户可以有0个或多个标签

在JPA中,有没有比让所有实体成为类似可标记抽象类的子类更好的方法呢?其中标签实体将引用许多标签。

编辑:标签云只是一个示例,用来简化我遇到的问题。在我的场景中,关系应该是OneToMany,其中标记不能被重用。

谢谢

EN

回答 4

Stack Overflow用户

发布于 2010-05-27 01:28:56

这看起来像是ManyToMany,而不是一对多。用户可以有多个标签,一个标签可以关联多个用户?

只有当你想在你的标签上建立一个与单个集合的关系时,你才需要这样一个超类,这个集合包含了用这个标签标记的每个对象。您对tag.getOneGiantCollectionOfEveryTaggedEntity()方法有什么要求吗?

既然标记的对象似乎没有任何共同之处,那么这样的集合在您的应用程序域中真的有任何价值吗?从表面上看,它也可能相当大,而且无论如何都不是你真正想要通过对象关系来处理的东西。从实际的角度来看,在不了解你的用例的情况下,tag.getTaggedUsers()tag.getTaggedPosts()等似乎更有用。

对不起,我想我问的问题比给出的答案多,但不清楚您希望完成的对象域是什么样子:)

编辑:

也许对所问问题的实际答案是“不,Hibernate不会为您映射一个没有共同祖先的原始类型集合,这些类型恰好都有指向您的实体的外键。”你没有必要在你的实体上强加一个“假”的超类,但是如果你不这样做,那么你将不得不做一个连接表。

。?

票数 1
EN

Stack Overflow用户

发布于 2010-05-27 12:40:31

中,有没有比让所有实体成为可标记抽象类之类的子类更好的方法呢?

让我们忘记这个例子:) JPA确实支持多态关联,但目标类必须是继承层次结构的一部分。下面是关于继承策略的更多经验法则:

  • SINGLE_TABLE:
    • 将层次结构中的所有类映射到单个表
    • 此策略提供了良好的支持实体和覆盖整个类层次结构的查询之间的多态关系。对于某些子类data

  • 可能包含空字段

  • TABLE_PER_CLASS: SQL联合层次结构中的每个类映射到单独的表,因此对多态relationships
  • requires SQL联合或每个subclass

的单独SQL查询的支持很差。

  • join
    • no null field => compact data
    • 这为多态关系提供了很好的支持,但需要一个或多个连接操作-可能会导致较差的null字段

简而言之,如果您的子类声明的属性相对较少,则首选SINGLE_TABLE策略。如果没有,请使用JOINED策略,除非您有很深的层次结构(在这种情况下,joins的成本可能会比联合更高,然后TABLE_PER_CLASS将“不那么糟糕”)。

参考文献

2.1.9 "Inheritance"

  • Section 2.1.10 "2.1.10继承映射Strategies"

  • JPA1.0规范
    • 第2.1.9节

票数 1
EN

Stack Overflow用户

发布于 2010-05-27 01:10:28

为什么你不直接映射一个标签甚至字符串的集合呢?

sudocode:

代码语言:javascript
复制
@Entity
@Table(name="entities")
class MyEntity{
    long id;
    String someField;
    @ManyToMany(targetEntity=Tag.class)
    @JoinTable(name="entities_to_tags",
         joinColumns={
             @JoinColumn(name="id",  
             referencedColumnName="entity_id",
             inverseJoinColumns={
                 @JoinColumn(name="id", referencedColumnName="tag_id")})
    List<Tag> tags;
    [...getter&setter...]
}

@Entity
@Table(name="tags")
class Tag{
    @Id
    @GeneratedValue
    long id;
    String title;
    [....getter & setter...]
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2914972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档