【问题标题】:Hibernate Mapping One-to-many in one tableHibernate Mapping 一对多在一张表中
【发布时间】:2012-09-12 21:23:01
【问题描述】:

我们有以下(设计不佳?)表:

inputs:
keyword_id serial not null,
group_name string not null,
banned_term string not null

关键字 ID 是主键。每个 group_name 有许多被禁止的术语。数据如下所示:

keyword_id | group_name | banned_term
1 | incentivization | free money
2 | inaccuracy | we're number one
3 | incentivization | win a free ipod!

没有连接表,group_name 不是它自己的实体。我想要一个类似这样的域对象:

class BannedTermGroup {
  Integer id;
  String group_name;
  Set<String> banned_terms;

  // ... various getters and setters
}

关于组名和禁用词之间的这种一对多关系的唯一示例都涉及某种连接列或连接表,而 group_name 将始终是某个其他实体的一部分。这里也不是这样。这可以使用 Hibernate 映射吗?

【问题讨论】:

  • 这没有意义。对于每个组,您有多个术语,因此有多个 ID,您的“模型”怎么可能只有 1 个 ID?
  • 你说得对。我猜该模型只需要 group_name 和banned_terms。

标签: java hibernate jpa orm


【解决方案1】:

正如我之前评论中所引用的,您可以从任何地方获取组的 ID。

抛开这个问题,你可以看看Hibernate的参考,搜索基本类型的集合。这是你需要的。

但是,您仍然需要为“组”准备一个表格。

假设它就像一个单列表一样简单:

KEYWORD_GROUP
--------------------
GROUP_NAME   STRING

您的原始关键字表:

KEYWORD
--------------------
GROUP_NAME   STRING
KEYWORD      STRING

我相信这就是你所需要的:

@Entity
@Table("KEYWORD_GROUP")
public class KeywordGroup {
   [.....]

   @ElementCollection
   @CollectionTable(name="KEYWORD", joinColumns=@JoinColumn(name="GROUP_NAME"))
   @Column(name="KEYWORD")
   private List<String> keywords;
}

对于keyword_group 表,如果您只是使用此模型进行读取,则可能不需要创建新表。从您的原始关键字表创建一个视图应该已经足够了。

【讨论】:

    猜你喜欢
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多