将@ElementCollection映射到同一个表

时间:2015-11-30 21:56:29

标签: java hibernate

我希望Hibernate只为我构建一个包含此列的表:

id | product_id | enum_id
1    1            1 
2    1            2

即。每个产品都可以有很多枚举。我不想引入新的链接表。

所以我的问题是如何注释我的字段以实现这样的表结构。

到目前为止,我有这个实体:

@Entity
public class Entity {

   @Id
   private Long id;

   @ManyToOne( fetch = FetchType.LAZY )
   @JoinColumn( name = "product_id" )
   private Product product;     

   @ElementCollection
   @??? // what should go here? 
   private List<Enum> enums = new Arralist<>();
}

2 个答案:

答案 0 :(得分:1)

您建议的表格将具有一个产品,并且每个Entity实例具有一个枚举。这与您的注释无关,但实际上实体将始终为每一行生成一个新实例,因为每一行都有自己的ID。

如果删除ID列,则给定的表已经是您的链接表,您只需要注释Product实体:

@Entity
public class Product {
  // ...

  @ElementCollection
  @Enumerated
  private Set<MyEnum> enums;

}

您需要在我的示例Enum中声明MyEnum的类型,因为您无法绑定到任何Enum(Hibernate不知道要实例化哪一个)从数据库中读取时。)

如果您想坚持使用任何现有的表名或列名,可以使用额外的@CollectionTable。但我建议使用默认值,因为它使代码更容易阅读。

如果您真的像第一次尝试一样,需要一个枚举列表(允许重复并存储项目的顺序),而不是列表中需要一个额外的索引列。您可以通过以下方式实现此目的:

@ElementCollection
@Enumerated
@OrderColumn
private List<MyEnum> enums;

答案 1 :(得分:0)

我可以看到你会添加多行不同的值,所以为什么不这样:

@ElementCollection
@CollectionTable(name="the_table_name", joinColumns=@JoinColumn(name="product_id")) @Column(name="product_id")
private Enum enum;

然后您可以在多行中添加连接到product_id的多个枚举。如果您希望每个产品只有一个位置,那么您可以使用@StanislavL提到的方法:

QString text = xmlReader.readElementText(QXmlStreamReader::IncludeChildElements);