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

时间:2015-01-10 16:26:26

标签: java spring hibernate jpa jpa-2.0

我正在攻读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

2 个答案:

答案 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