【问题标题】:JPA/Hibernate mapping to store months and days-of-monthsJPA/Hibernate 映射以存储月份和日期
【发布时间】:2008-11-25 20:43:57
【问题描述】:

我有以下 POJO:

class Month {
    long id;
    String description;
    List<Day> days; // always contains 29, 30 or 31 elements
}

class Day {
    byte nr; // possible values are 1-31
    String info;
}

有没有办法使用 JPA+Hibernate 将这些对象存储到以下 DB 结构中:

表月份:

id;描述;

餐桌天数:

月份id;nr-of-day;信息;

对于这种情况有更好的解决方案吗?

【问题讨论】:

    标签: java hibernate jpa persistence


    【解决方案1】:

    如果你不能改变你的 pojo 或表格结构,那你就有点搞砸了。如果可以的话,一个简单的带注释的 pojo 就可以了。

    class Month {
       @Id
       private long id;
       private String description;
       @OneToMany(mappedBy="month",fetchType=Lazy)
       private List<Day> days;
    
    }
    

    ---- Days 表需要代理键更改数据库

    class Day {
        @Id
        private int id;
        private Month month;
        private byte nr; // possible values are 1-31
        private String info;
    }
    

    【讨论】:

      【解决方案2】:

      这是我找到的一种解决方案:

      class Month {
          long id;
          String description;
      
          @CollectionOfElements(fetch = FetchType.EAGER)
          @IndexColumn(name = "nr-of-day")
          List<Day> days; // always contains 29, 30 or 31 elements
      }
      
      @Embeddable
      class Day {
          byte nr; // possible values are 1-31
          String info;
      }
      

      @CollectionOfelements 和 @IndexColumn 是 Hibernate 注释。如果我使用 JPA 中可用的 @OneToMany 注释,hibernate 会创建 3 个表而不是 2 个。

      我现在唯一的问题是 Day.nr 被保存了两次:第一次作为 List 的 IndexColumn(基于 0 的计数器),第二次作为 Day 类的字段(基于 1 的计数器)。

      【讨论】:

        【解决方案3】:

        您能否将 Month @Entity 类 UNIDIRECTIONAL 与 Day @Entity 类映射,而不使用 CascadeType.PERSIST 的 @Embeddable,其中 @Entity Day 类的标识符由 Month 标识符和列表索引组成,如下所示?

        @Entity 公开课月{

        @Id
        @GeneratedValue
        private Integer id;
        
        
        // one way relationship
        @OneToMany(cascade=CascadeType.PERSIST)
        @JoinColumn(name="MONTH_ID")
        @IndexColumn(name="childIndex")
        private List<Day> dayList = new ArrayList<Day>();
        

        }

        @Entity 公开课日{

        @EmbeddedId // composed by month foreign key and index column
        private DayId id;
        

        }

        希望你能解决这个问题

        问候 Arthur Ronald F D Garcia(Java 程序员) 纳塔尔/Rn - 巴西

        【讨论】:

          猜你喜欢
          • 2011-06-27
          • 1970-01-01
          • 2021-01-23
          • 2012-05-09
          • 1970-01-01
          • 1970-01-01
          • 2023-04-11
          • 2013-12-15
          • 2019-02-24
          相关资源
          最近更新 更多