我正在攻读Spring Core认证,并且我对在课程幻灯片中找到的 JPA 示例有一些疑问:
有2个实体类映射2个表:
1)客户实体类,用于映射 T_CUSTOMER 数据库表:
@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)地址映射 T_ADDRESS 数据库表的实体类:
@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;
}
所以我对这个提供的例子有两个疑问:
1)为什么进入地址类没有 @Column 注释?如果 @Column 注释没有提供,那么JPA是否可以使用属性名称来匹配defaut的数据库表列名称?
2)正如您在上一个示例中所看到的,客户实体类包含代表一对多关系的字段
@OneToMany
@JoinColumn (name=“cid”)
private Set<Address> addresses;
所以我认为这意味着 T_CUSTOMER 表的一行与 T_ADDRESS 表的更多行相关联,并且这些行表示为<的集合< strong>地址模型实例。是不是?
现在我怀疑是使用 cid 名称完成加入。此名称不会显示为地址类的属性。那是什么?它是属于 T_ADDRESS 的列的名称,并且未由实体类地址映射?
TNX
答案 0 :(得分:2)
1:你的假设是正确的
2:这是一个uni-directional one-to-many relation,这意味着每个客户都可以列出地址,并通过名为 cid 的列加入在另一张桌子上(外键。)所以你可以(直接)获得属于客户的地址,但不能反过来。
更新(希望我有更多的SO声誉发表评论)
currently accepted answer的部分内容不正确:
如果您没有使用@Column注释Bean / Entity类的字段/属性,则ORM提供程序(例如Hibernate)将为相应的Bean / Entity创建一个表,其列名称为Bean / Entity字段名称。
JPA implementations such as Hibernate需要一些额外的配置来自动为您生成/更新表。对于Hibernate,您需要在持久性配置中设置hbm2ddl.auto
属性。
您的Customer类包含一对一映射
显然它包含一对多的映射。
答案 1 :(得分:1)
1)为什么在Address类中没有 @Column 注释?
@Column 注释是可选的。默认情况下,如果您没有使用 @Column 注释Bean / Entity类的字段/属性,那么 ORM 提供程序(例如 Hibernate )将为相应的Bean / Entity创建一个表,其列名称为Bean / Entity字段名称。
2)现在我怀疑是使用cid名称完成了连接。此名称不显示为我的Address类的属性。那是什么?它是属于T_ADDRESS的列的名称,并且未由实体类Address映射吗?
您的Customer类包含一对一映射:
...
@OneToMany
@JoinColumn (name=“cid”)
private Set<Address> addresses;
…
使用此映射,ORM可以识别Address表中哪些记录属于具有特定ID的Customer;
请考虑此Customers表:
----------------------------------------------------------------------------
| Cust_id | Cust_firstname | Cust_lastname | Cust_email | Cust_mobile |
----------------------------------------------------------------------------
| 101 | XXXX | YYYYY |xxx@xyz.com | 8282263131 |
----------------------------------------------------------------------------
Above customers表有一条记录,cust_id为101。
现在考虑一下这个地址表:
----------------------------------------------------------------------------
| id | street | suburb | city | zipcode | cid |
----------------------------------------------------------------------------
| 1 | streetX | AreaY | cityZ | 54726 | 101 |
----------------------------------------------------------------------------
| 2 | streetXA | AreaYB | cityZS | 60660 | 101 |
----------------------------------------------------------------------------
您的地址表包含外键列 cid ,最好将您的外键列放在Secondry表中,这是默认机制在Hibernate。
正如您在地址表中所看到的, id 1 和 2 的记录属于 cust_id 为 101