【问题标题】:Map @ElementCollection to same table将@ElementCollection 映射到同一张表
【发布时间】:2015-11-30 21:56:29
【问题描述】:

我希望 Hibernate 只为我构建 1 个包含这些列的表:

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<>();
}

【问题讨论】:

  • 喜欢这个@CollectionTable(name="the_table_name", joinColumns=@JoinColumn(name="product_id")) @Column(name="product_id") ?

标签: java hibernate


【解决方案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;

【讨论】:

    【解决方案2】:

    我可以看到您将添加具有不同值的多行,所以为什么不这样:

    @Entity
    public class Entity {
    
      @Id
      private Long id;
    
      @ManyToOne( fetch = FetchType.LAZY )
      @JoinColumn( name = "product_id" )
      private Product product;     
    
      @Enumerated(EnumType.STRING)
      private Enum enum;
    

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

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

    【讨论】:

    • 没有集合的@ElementCollection 没有任何意义。在 OP 的示例中,该表包含 enum 的序号,而不是字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    相关资源
    最近更新 更多