【问题标题】:JPA - OneToMany, ManyToOne, OneToOne problemJPA - OneToMany、ManyToOne、OneToOne 问题
【发布时间】:2011-08-04 10:49:35
【问题描述】:

给定以下两个实体:

class Parent {
       @OneToMany(cascade=CascadeType.ALL)
       private Set<Child> children;

       (...)
}


class Child {
       @ManyToOne
       private Parent parent;

       (...)
}

我想要数据库中有两个表。一张给父母,一张给孩子。但是 Hibernate 创建了三张表:一张给父母,一张给孩子,一张给他们加入(有两个字段的表格)。

即使我将@OneToOne 放在 Child 类的父属性上,我仍然得到相同的结果。

我错过了什么?

【问题讨论】:

    标签: java hibernate jpa one-to-many many-to-one


    【解决方案1】:

    mappedBy 属性添加到Parent 类中的@OneToMany。这使得Child 成为拥有方。

    Child 中,在parent 字段中添加@JoinColumn 注释,以便在子表中声明外键列名。

    来自@OneToMany#mappedBy上的JavaDoc:

    拥有关系的字段。除非关系是单向的,否则是必需的。

    单向关系需要一个连接表,但在您的情况下它是双向的,因此它是必需的。

    【讨论】:

    • Hibernate 自动为我生成一个正确的 FK:parent_id。使用 JoinColumn 重要吗?
    • @Stephan 不,如果生成的列适合您,则无需使用 @JoinColumn
    【解决方案2】:

    注释中的 ma​​ppedBy="parent" 属性用于构建双向关联。

    class Parent {
       @OneToMany(mappedBy="parent",cascade=CascadeType.ALL)
       private Set<Child> children;
    
       (...)
    }
    
    class Child {
       @ManyToOne
       private Parent parent;
    
       (...)
    }
    

    【讨论】:

    • 如果您有 Person OneToMany Items,并且一个项目只能由一个 Person 拥有,该怎么办。 Item 会有 ManyToOne 还是 OneToOne ?对我来说,它似乎应该是 OneToOne 那里的孩子现在(考虑到你只能有一个父母)
    【解决方案3】:

    假设您在子表中的外键列称为“parent_id”,请尝试

    @OneToMany(mappedBy="parent")
    private Set<Child> children;
    

    @ManyToOne
    @JoinColumn(name="parent_id")
    private Parent parent;
    

    【讨论】:

    • 拥有它真好。 hibernate 不知道外键约束。所以hibernate只能猜测(使用名称模式假设)哪个列用于该关系。因此,最好是明确的。
    猜你喜欢
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    相关资源
    最近更新 更多