【问题标题】:Persisting a list of elements with composite keys使用复合键持久化元素列表
【发布时间】:2009-08-26 23:26:19
【问题描述】:

我正在使用 java 持久性来保存与另一个实体关联的实体列表。以下是我遇到问题的简要说明。

@Entity public class Offer implements Serializable {
  @Id private Long offerId;

  @OneToMany
  @Column List<OfferCategory> offerCategories;
}

@Entity public class OfferCategory implements Serializable {

  @Embeddable public static class Id implements Serializable
  {
      @Column(name="offer_id")
      private Long offerId;

      @Column(name="category_id")
      private Long categoryId;

      public Id() {}

      public Id(Long offerId, Long categoryId) {
          this.offerId = offerId;
          this.categoryId = categoryId;
      }

      public boolean equals(Object o) {
          if(o != null && o instanceof Id) {
              Id other = (Id) o;
              return this.offerId.equals(other.offerId) &&
                      this.categoryId.equals(other.categoryId);
          }
          else
              return false;
      }

      public int hashCode() {
          return offerId.hashCode() + categoryId.hashCode();
      }
  }
  @EmbeddedId private Id id = new Id();
}

基本上,由于我无法更改的架构,我需要将类别列表保存为分配给优惠。

现在,我从用户那里获取了一个类别列表,然后将它们放入 Offer 的 offerCategories 字段中。但是,这不适用于新商品,因为我无法设置新商品的 ID。

我是 JPA 和 Seam 的新手,所以如果有人能在正确的方向上给我一点建议,我将不胜感激。

【问题讨论】:

    标签: java jpa persistence seam


    【解决方案1】:

    我之前没有尝试过使用复合 ID,但需要注意的一点是,@Column 仅用于更改字段正在使用的数据库列的属性。它没有规定关系,所以你仍然需要这样的东西:

    @OneToMany    
    List<OfferCategory> offerCategories;
    

    【讨论】:

      【解决方案2】:

      当我查看教程时,我发现this

      您不能使用 IdentifierGenerator 生成复合键。相反,应用程序必须分配自己的标识符。

      所以你必须自己分配id。也许您可以创建一个数据库序列并使用本机查询获取其值?
      还有一点要注意 - 如果要使用列表映射(商品中的类别顺序由数据库定义),则需要一个索引列来包含列表中的索引。如果类别的顺序不重要,Set会更方便。

      【讨论】:

      • 但是如果他们都是Offer的孩子,我给他们分配一个category,是不是应该可以在给Offer分配一个新id的同时填写id?跨度>
      【解决方案3】:

      好吧,我现在的解决方案是我将每一个都持久化(为新条目创建键),然后将它们填充到一个列表中,然后将它们填充到它们的容器对象中,然后持久化该对象。

      【讨论】:

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