【问题标题】:Hibernate Mappedby ExampleHibernate Mappedby 示例
【发布时间】:2014-02-15 16:41:51
【问题描述】:

Hibernate Docs (2.2.5.1. 一对一) 提供以下示例:

@Entity
public class Customer implements Serializable {
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="passport_fk")
    public Passport getPassport() {
        ...
    }

@Entity
public class Passport implements Serializable {
    @OneToOne(mappedBy = "passport")
    public Customer getOwner() {
    ...
}   

据我了解,CustomerPassport 具有一对一的关系,其中Customer 是所有者,即负责对Passport 进行级联更新。 Passport 中的mappedBy 表示它与Customer 是一对一的关系,但它不负责对Customer 的级联更新。

CustomerPassport 有外键约束,反之亦然,PassportCustomer

Customer@JoinColumn(name="passport_fk") 是什么意思? PassportmappedBy 中的passport 怎么样?它们是代表各自外键的表列吗?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:
    What is the meaning of the @JoinColumn(name="passport_fk") of Customer?
    

    这意味着将在 Customer 表中创建 passport_fk 字段,因为它在此处属于,因此该表被视为关系的所有者(不过您似乎明白这一点)。

     How about passport in the mappedBy of Passport
    

    由于这是用 mappedBy 注释的,它表明这不是所有者,并且所有者是客户(被注释的字段)。 name 属性告诉 Hibernate 在哪里可以找到有关 FK 映射的信息(在 Customer 内部有一个 getPassport 方法)。 Passport 中不会创建其他字段。

    【讨论】:

    • 所以@OneToOne(mappedBy = "passport") 表示存在一对一关联,而Customerpassport 字段映射它(护照)?此外,是否可以在没有现有客户的情况下创建 Passport?换句话说,Passport 对客户有影响吗?
    • @KevinMeredith 是的 OneToOne 意味着一对一,很明显。不,你不能在没有父母的情况下创建孩子。在数据库级别考虑一下,由于数据库中没有 PK,因此无法插入 Child。
    • 基于这个答案(stackoverflow.com/a/9108618/409976),那么我的理解是Passport 不会对Customer 有外键约束。
    • @KevinMeredith 最后我有时间重新阅读这个问题。由于您拥有正确的映射,您可以毫无问题地单独插入子级和父级,这是因为默认情况下 Hibernate 不会在 FK 上创建唯一约束,它们只会为空。因此,即使您有 FK 约束,也不会强制执行,除非,例如,您将 optional=false 放在 OneToOne 上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    相关资源
    最近更新 更多