当前位置: 代码迷 >> java >> JPA / Hibernate映射到存储月份和每月的几天
  详细解决方案

JPA / Hibernate映射到存储月份和每月的几天

热度:79   发布时间:2023-07-25 19:28:40.0

我有以下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将这些对象存储到以下数据库结构中:

表月:

id;description;

表天:

id-of-month;nr-of-day;info;

有什么更好的解决方案吗?

如果您无法更改pojo或表的结构,那会有些麻烦。 如果可以的话,一个简单的带注释的pojo就可以了。

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

}

----代理密钥需要更改天数表的数据库

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

您是否可以使用CascadeType.PERSIST映射不带@Embeddable的Day @Entity类与Month @Entity类UNIDIRECTIONAL关系,而@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>();

}

@实体公共课堂日{

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

}

希望你能解决这个问题

关于Arthur Ronald FD Garcia(Java程序员)Natal / Rn-巴西

这是我发现的一种解决方案:

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开始的计数器)。

  相关解决方案