为什么Hibernate提供@Embeddable和@Embedded

时间:2018-07-26 17:09:54

标签: hibernate jpa

已正确定义实体对象。能够成功保存数据。

@Embeddable
public class Address {

    private Integer houseNo;
    private String streetName;
    private String state, country;
}

@Entity
public class College {
    @Id
    @GeneratedValue
    private Integer collegeId;
    private String cName;

    @Embedded
    Address address;
}

但是,当我在休眠应用程序中使用@Embeddable和@Embedded时,最终结果如下所示。

mysql> select * from college;
+-----------+---------+---------+----------+--------------+-------+
| collegeId | country | houseNo | state    | streetName   | cName |
+-----------+---------+---------+----------+--------------+-------+
|         1 | Makkah  |     121 | Al-Azeed | Bilaal Stree | SMust |
+-----------+---------+---------+----------+--------------+-------+

我的疑问是,如果地址字段已保存在同一表中,为什么我们使用@Embeddable和@Embedded。除此之外,我们不能直接在College实体中定义“地址”字段吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

因为使用了最佳实践。使用合成来创建实体有利于提高可读性。而且总是应该优先考虑使用组合而不是继承,这对于实体也同样有效。此外,使用类来表示您的模型可以更轻松地映射Java类和数据库表。此外,Address类可以在其他实体中重用,而不必一次又一次重复相同的字段。

如果要获取存储在另一个表中的Address类,则可以继续使用组合,但可以通过数据库关系映射模型。在这种情况下,您需要将Address类转换为@Entity,并创建一个从College到Address的@OneToOne关系。

@Entity
public class Address {

    @Id
    @GeneratedValue
    private Integer id;

    private Integer houseNo;

    private String streetName;

    private String state, country;
}

@Entity
public class College {

    @Id
    @GeneratedValue
    private Integer collegeId;

    private String cName;

    @OneToOne(optional = false)
    private Address address;
}