【问题标题】:JPA OneToMany and ManyToOne with a composite key is generating a third table具有复合键的 JPA OneToMany 和 ManyToOne 正在生成第三个表
【发布时间】:2011-12-26 21:15:19
【问题描述】:

我正在映射一个过滤器---

@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 个表: 过滤器PK(名称) FilterColumn PK(filter_name, name) Filter_FilterColumn PK(filter_filter_name, filterColumn_filter_name, filterColumn_name)

我真正想要的只是两张表,例如: 过滤器PK(名称) Filter_Column PK(name, filter_name)

为什么我会收到这个结果?我的映射有问题吗?我应该改变什么?

提前致谢。

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    我认为您需要在 @OneToMany 上添加一个 mappedBy。没有它,映射器不知道它可以查看filtercolumn 表来查找与Filter 关联的实体,因此它会生成filter_filtercolumn 表。

    我不知道你是如何使用复合键的mappedBy。鉴于您使用的是@EmbeddedId,我认为它只是mappedBy = "id"

    你能在这样的关键类中使用@ManyToOne 吗?这是 JPA 规范之上的 Hibernate 扩展吗?您通常不需要@MapsId 吗?

    【讨论】:

      【解决方案2】:

      尝试在复合 ID 的过滤器成员上添加 @JoinColumn 注释。实际的列将是 Filter 表的 id 是什么(或者如果你让 hibernate 生成它,就让它没有名字)。

      让我知道这是否可行,因为我遇到了类似的问题并使用上述方法解决了它,所以我知道这是可能的。我唯一拥有的其他东西是 @ForeignKey 注释,但我认为 hibernate 会为你处理这个问题 - 我只是这样做是因为我想坚持命名约定。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-07
        • 2016-11-14
        • 1970-01-01
        • 1970-01-01
        • 2015-07-02
        • 1970-01-01
        • 2011-11-26
        • 1970-01-01
        相关资源
        最近更新 更多