[英]How exactly works this JPA mapping?
我正在為獲得Spring Core認證而學習,對於在課程幻燈片中找到的這個JPA示例,我有些疑問:
有2個實體類可映射2個表:
1)映射T_CUSTOMER DB表的客戶實體類:
@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 DB表的地址實體類:
@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類中沒有@Column注釋? 如果@Column注釋未提供,則JPA可能使用屬性名稱與defaut的數據庫表列名稱進行匹配?
2)如上例所示, 客戶實體類包含表示一對多關系的該字段
@OneToMany
@JoinColumn (name=“cid”)
private Set<Address> addresses;
所以,我認為,這意味着在T_CUSTOMER表的一行中相關聯的T_ADDRESS表的多個行,這些行表示為地址機型實例的集合。 這樣對嗎?
現在,我的疑問是聯接是使用cid名稱完成的。 該名稱不會顯示為我的Address類的屬性。 那是什么 它是屬於T_ADDRESS的列的名稱,並且不是由實體類Address映射的嗎?
特納克斯
1:您的假設是正確的
2:這是單向一對多關系 ,這意味着每個客戶都可以有一個地址 es列表,該列表由另一個表上的名為cid的列(外鍵)連接。因此,您可以(直接)獲取屬於的地址 es 客戶,但並非相反。
更新(希望我有更多的SO名譽來發表評論)
當前接受的答案的某些部分不正確:
如果您不使用@Column注釋Bean / Entity類的字段/屬性,則ORM提供程序(例如Hibernate)將為相應的Bean / Entity創建一個表,並使用列名作為Bean / Entity字段名。
諸如Hibernate之類的JPA實現需要一些額外的配置才能為您自動生成/更新表。 對於Hibernate,您需要在持久性配置中設置hbm2ddl.auto
屬性。
您的客戶類包含一對一映射
顯然,它包含一對多映射。
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使用此映射來標識“地址”表中的哪些記錄屬於具有特定ID的“客戶”;
考慮此客戶表:
----------------------------------------------------------------------------
| Cust_id | Cust_firstname | Cust_lastname | Cust_email | Cust_mobile |
----------------------------------------------------------------------------
| 101 | XXXX | YYYYY |xxx@xyz.com | 8282263131 |
----------------------------------------------------------------------------
上述客戶表具有一條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的同一客戶
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.