JPA / Hibernate映射存储月和月的日期

时间:2008-11-25 20:43:57

标签: java hibernate jpa persistence

我有以下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;description;

表日:

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

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

3 个答案:

答案 0 :(得分:1)

如果你不能改变你的pojo或桌面结构,你就有点搞砸了。如果可以的话,一个简单的注释pojo将起作用。

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

}

----代理键需要对Days表进行DB更改

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

答案 1 :(得分:0)

我找到了一个解决方案:

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的计数器),第二次是class Day的字段(基于1的计数器)。

答案 2 :(得分:0)

你能否将一个月@Entity类UNIDIRECTIONAL关系与没有@Embeddable的Day @Entity类映射到CascadeType.PERSIST,其中@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 - 巴西