2011-12-26 49 views
0

我映射器--- < FilterColumn其中篩選呈現基數之一,FilterColumn N.因此,映射類是:JPA一對多和多對一與複合鍵生成第三個表

@Entity 
public class Filter implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    private String name; 
    private String caption; 
    @OneToMany(cascade = CascadeType.MERGE, targetEntity = FilterColumn.class) 
    private Set<FilterColumn> columns; 

    // setters and getters 

} 



@Entity 
public class FilterColumn implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    private FilterColumnId id; 
    private String caption; 

    // getters and setters 

@Embeddable 
public static class FilterColumnId implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @ManyToOne 
    private Filter filter; 
    @Column 
    private String name; 

    // getters and setters 

} 


} 

但當我開始降創建指令以下3個表創建的應用程序: 篩選PK(名稱) FilterColumn PK(FILTER_NAME,名) Filter_FilterColumn PK(filter_filter_name,filterColumn_filter_name,filterColumn_name)

我真正想要的是隻有兩個表,如: 過濾器PK(名稱) Filter_Column PK(name,filter_name)

爲什麼我會收到此結果?我的映射有問題嗎?我應該改變什麼?

在此先感謝。

回答

2

我認爲你需要一個mappedBy@OneToMany。沒有這些,映射器不知道它可以查看filtercolumn表來查找與Filter相關聯的實體,因此它會生成filter_filtercolumn表。

不知道我的頭頂上你如何使用複合鍵的mappedBy。鑑於您使用的是@EmbeddedId,我認爲它只是mappedBy = "id"

你能在這樣的密鑰類中使用@ManyToOne嗎?這是一個超越JPA規範的Hibernate擴展嗎?你通常不需要在那裏有@MapsId嗎?

0

嘗試在複合標識的過濾器成員上添加@JoinColumn批註。實際的列可以是Filter表的ID(或者如果讓hibernate生成它,就讓它沒有名字)。

讓我知道這是否有效,因爲我有類似的問題,並使用上述解決它,所以我知道這是可能的。我唯一的其他東西是@ForeignKey註釋,但我認爲hibernate會爲你處理這個問題 - 我只是做了我的,因爲我想堅持一個命名約定。