问题描述
我有以下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;
有什么更好的解决方案吗?
1楼
如果您无法更改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;
}
2楼
您是否可以使用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-巴西
3楼
这是我发现的一种解决方案:
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开始的计数器)。