这个 JPA 映射究竟是如何工作的?

How exactly works this JPA mapping?

我正在学习 Spring 核心认证,我对在课程幻灯片上找到的这个 JPA 示例有一些疑问:

有 2 个实体 classes 映射 2 tables:

1) Customer 实体 class 映射 T_CUSTOMER DB table:

@Entity
@Table(name= “T_CUSTOMER”)
public class Customer {
    @Id
    @Column (name=“cust_id”)
    private Long id;

    @OneToMany
    @JoinColumn (name=“cid”)
    private Set<Address> addresses;
    …
    …
    …
}

2) Address 映射 T_ADDRESS DB table 的实体 class:

@Entity
@Table(name= “T_ADDRESS”)
public class Address {

    @Id private Long id;
    private String street;
    private String suburb;
    private String city;
    private String postcode;
    private String country;

}

所以我对这个提供的例子有 2 个疑问:

1) 为什么在Address class里面没有@Column注解?如果 @Column 注释未提供,JPA 可能会使用 属性 名称与数据库 table 列名称进行默​​认匹配?

2) 正如您在前面的示例中看到的那样,Customer 实体 class 包含表示 One To Many[=50] 的字段=]关系

@OneToMany
@JoinColumn (name=“cid”)
private Set<Address> addresses;

所以我认为这意味着 T_CUSTOMER table 的一行与 [= 的更多行相关联68=] table 并且这些行表示为 Address 模型实例的集合。对吗?

现在我怀疑连接是使用 cid 名称完成的。此名称未显示为我的 地址 class 的 属性。那是什么?它是属于 T_ADDRESS 且未被实体 class Address 映射的列的名称吗?

Tnx

1:你的假设是正确的

2:那是一个 uni-directional one-to-many relation,这意味着每个 Customer 都可以有一个由名为cid 在另一个 table (外键。)所以你可以(直接)得到 Addresses 属于 客户但反之则不然。

更新(希望我有更多的评论声望)

的部分内容不正确:

If you are not annotating your fields/properties of your Bean/Entity class with @Column then ORM provider (e.g. Hibernate) will create a table for the corresponding Bean/Entity with the column names as your Bean/Entity field names.

JPA implementations such as Hibernate 需要一些额外的配置才能自动为您 generate/update table。对于 Hibernate,您需要在持久性配置中设置 hbm2ddl.auto 属性。

Your Customer class contains a one-to-one mapping

显然它包含一对多映射。

1)为什么进入地址class没有@Column注释?

@Column 注释是可选的。默认情况下,如果您未使用 @Column 注释 fields/properties 或 Bean/Entity class,则 ORM 提供程序(例如 Hibernate)将为相应的 Bean/Entity 创建一个 table,并将列名作为您的 Bean/Entity 字段名。

2) 现在我怀疑连接是使用 cid 名称完成的。此名称未显示为我的地址 class 的 属性。那是什么?它是属于 T_ADDRESS 且未被实体 class 地址映射的列的名称吗?

您的客户 class 包含一对一映射:

...
@OneToMany
@JoinColumn (name=“cid”)
private Set<Address> addresses;
…

使用此映射,ORM 识别地址 table 中的哪些记录属于具有特定 ID 的客户;

考虑这个客户 table :

----------------------------------------------------------------------------
| Cust_id  | Cust_firstname | Cust_lastname  |  Cust_email  |  Cust_mobile |
----------------------------------------------------------------------------
|   101    |       XXXX     |    YYYYY         |xxx@xyz.com |  8282263131  |
----------------------------------------------------------------------------

以上客户table有一条记录cust_id为101。

现在考虑这个地址 Table :

----------------------------------------------------------------------------
| id       |   street    |    suburb     |   city   |  zipcode |    cid    |
----------------------------------------------------------------------------
|   1      |   streetX   |    AreaY      | cityZ    |  54726   |    101    |
----------------------------------------------------------------------------
|   2      |   streetXA  |    AreaYB     | cityZS   |  60660   |    101    |
----------------------------------------------------------------------------

您的地址 Table 包含一个 外键 列作为 cid,这是拥有外键的好习惯Secondry 中的列 table,这是 Hibernate 中的默认机制。

从地址table可以看出,id的记录都是12cust_id101

属于同一个客户