我不知道如何用JPA干净利落地创建一个标签云,其中每个数据库实体都可以有许多标签。
E.g
帖子可以有0个或多个标签用户可以有0个或多个标签
在JPA中,有没有比让所有实体成为类似可标记抽象类的子类更好的方法呢?其中标签实体将引用许多标签。
编辑:标签云只是一个示例,用来简化我遇到的问题。在我的场景中,关系应该是OneToMany,其中标记不能被重用。
谢谢
发布于 2010-05-27 01:28:56
这看起来像是ManyToMany,而不是一对多。用户可以有多个标签,一个标签可以关联多个用户?
只有当你想在你的标签上建立一个与单个集合的关系时,你才需要这样一个超类,这个集合包含了用这个标签标记的每个对象。您对tag.getOneGiantCollectionOfEveryTaggedEntity()方法有什么要求吗?
既然标记的对象似乎没有任何共同之处,那么这样的集合在您的应用程序域中真的有任何价值吗?从表面上看,它也可能相当大,而且无论如何都不是你真正想要通过对象关系来处理的东西。从实际的角度来看,在不了解你的用例的情况下,tag.getTaggedUsers()、tag.getTaggedPosts()等似乎更有用。
对不起,我想我问的问题比给出的答案多,但不清楚您希望完成的对象域是什么样子:)
编辑:
也许对所问问题的实际答案是“不,Hibernate不会为您映射一个没有共同祖先的原始类型集合,这些类型恰好都有指向您的实体的外键。”你没有必要在你的实体上强加一个“假”的超类,但是如果你不这样做,那么你将不得不做一个连接表。
。?
发布于 2010-05-27 12:40:31
在
中,有没有比让所有实体成为可标记抽象类之类的子类更好的方法呢?
让我们忘记这个例子:) JPA确实支持多态关联,但目标类必须是继承层次结构的一部分。下面是关于继承策略的更多经验法则:
,
的单独SQL查询的支持很差。
简而言之,如果您的子类声明的属性相对较少,则首选SINGLE_TABLE策略。如果没有,请使用JOINED策略,除非您有很深的层次结构(在这种情况下,joins的成本可能会比联合更高,然后TABLE_PER_CLASS将“不那么糟糕”)。
参考文献
2.1.9 "Inheritance"
发布于 2010-05-27 01:10:28
为什么你不直接映射一个标签甚至字符串的集合呢?
sudocode:
@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...]
}https://stackoverflow.com/questions/2914972
复制相似问题