繁体   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