【问题标题】: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 - 巴西