簡體   English   中英

這個JPA映射如何工作?

[英]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中的默認機制。

從地址表中可以看到, id12的兩個記錄都屬於cust_id101的同一客戶

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM