2008-11-25 25 views
0

我有以下的POJOs:JPA/Hibernate映射存儲月和天的月

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;

針對這種情況的任何更好的解決方案?

回答

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的計數器),第二次作爲類日的領域(基於1的計數器)。

1

如果你不能改變你的pojo或表格結構,你有點擰。如果你可以,那麼一個簡單的帶註釋的pojo將起作用。

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

} 

----好幾天表代理鍵需要DB變化

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

可以在地圖上與日@Entity類一個月@Entity類單向關係,而不與@Embeddable代替CascadeType.PERSIST, @Entity Day類的標識符由Month標識符和列表索引組成,如下所示?

@實體公共類月份{

@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; 

}

我希望你解決這個問題

Regards Arthur Ronald F Garcia(Java程序員) Natal/Rn - 巴西