【问题标题】:Hibernate "mappedBy" use休眠“mappedBy”使用
【发布时间】:2013-04-13 20:43:12
【问题描述】:

我已经阅读了几个关于使用 Hibernate 在表之间创建关联的示例,但我有点困惑。我最初想知道将在数据库中创建多少个表,而无需像代码一样在另一侧指定任何注释:

@Entity
public class Flight implements Serializable {
    @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
    @JoinColumn(name="COMP_ID")
    public Company getCompany() {
        return company;
    }
    ...
} 

我怀疑两个表 Flight、Company 和 Flight 包含外键 Company_Id。我对吗?如果我在另一侧添加“mappedBy”有什么区别:

@Entity
public class Company {
    @OneToMany(mappedBy="company")
    public Set<Flight> getFlights() {
        ...
    }
}

第二种方法将创建多少个表?我想第二种方法建立了双向关联。这两种情况有什么实际区别? @ManyToMany 关联中的“mappedBy”注解又是怎么回事?

【问题讨论】:

  • 您在问这两种情况有什么区别,但您只提出一种情况。另一种情况是什么?另外,请阅读此答案:stackoverflow.com/questions/16119531/…
  • 第一种情况是在公司实体中没有任何注释,第二种情况是带有注释@OneToMany(mappedBy="company"),如您在第二个代码片段中看到的那样。

标签: hibernate jakarta-ee jpa


【解决方案1】:

当您使用双向关系时,使用 mappedby 可以避免在两个表中存储关系的更改。从您的示例中,如果您删除 mappedby、flight 和 company,这两个表都将具有关系字段。

【讨论】:

    【解决方案2】:

    如果您没有在航班属性上添加任何注释,则将应用默认映射,即@Basic。这意味着列表的全部内容将被序列化并存储在名为航班的列中。

    这显然不是你想要的。您想要的是使其成为 Flight 中定义的 ManyToOne 关联的反面。这就是@OneToMany(mappedBy = "company") 所做的。

    除此之外,您的假设是正确的。 ManyToOne 默认使用实体表中的连接列进行映射。使用 JoinColumn 注释允许为连接列指定一个默认名称以外的名称(以及此连接列的其他属性)。

    【讨论】:

    • “列表的全部内容将被序列化并存储在名为航班的列中”是什么意思?在数据库中是如何描述的?为了理解,我需要解释数据库中发生了什么。我也想对“Flight 中定义的 ManyToOne 关联的反面”进行相同的解释。
    • 我的意思是Java序列化将用于将列表的全部内容转换为字节数组,并且这个字节数组将存储在company表中名为flights的列中。作为 ManyToOne 的反面意味着这两个字段实际上是同一个关联:公司 C1 有航班 F1、F2 和 F3,因为 F1、F2 和 F3 有 C1 作为他们的公司。需要 Flight 表中的单个连接列来映射此双向关联。
    猜你喜欢
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多