[英]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.