簡體   English   中英

具有復合鍵的JPA OneToMany和ManyToOne正在生成第三個表

[英]JPA OneToMany and ManyToOne with a composite key is generating a third table

我正在映射一個Filter --- <FilterColumn,其中Filter表示基數為1,FilterColumn為N.所以映射的類是:

@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

}


}

但是當我使用drop-create指令啟動應用程序時,會創建以下3個表:Filter PK(name)FilterColumn PK(filter_name,name)Filter_FilterColumn PK(filter_filter_name,filterColumn_filter_name,filterColumn_name)

我真正想要的只是兩個表:Filter PK(name)Filter_Column PK(name,filter_name)

為什么我收到這個結果? 我的映射有問題嗎? 我應該改變什么?

提前致謝。

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

我不確定你如何使用復合鍵對mappedBy進行操作。 鑒於你正在使用@EmbeddedId ,我認為它只是mappedBy = "id"

你可以在這樣的關鍵類中使用@ManyToOne嗎? 這是一個超出JPA規范的Hibernate擴展嗎? 你通常@MapsId在某處需要@MapsId嗎?

嘗試在復合ID的Filter成員上添加@JoinColumn注釋。 實際的列將是Filter表的id的任何內容(或者如果讓hibernate生成所有內容,則只留下它沒有名稱)。

讓我知道這是否有效,因為我遇到了類似的問題並使用上述方法解決了它,所以我知道這是可能的。 我唯一的另一個東西是@ForeignKey注釋,但我認為hibernate將為你照顧 - 我只是做了我的,因為我想堅持命名約定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM