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