已正确定义实体对象。能够成功保存数据。
@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实体中定义“地址”字段吗?
谢谢。
答案 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;
}