这个 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的记录都是1和2 与 cust_id 和 101
属于同一个客户
我正在学习 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的记录都是1和2 与 cust_id 和 101
属于同一个客户