我正在将我的JDBC项目迁移到Hibernate。 我对存储在我的数据库中的参考数据有疑问,特别是它是联合国国家名单。 我是从here获得的。
当我使用JDBC时,我只有一个包含该数据的表,而我曾经用它来验证数据库中的数据。例如,用户无法输入他居住在该表中不存在的国家。
现在,我有一个代表一个人的Pojo,我有一个代表一个国家的字符串成员,我如何坚持Hibernate,我是否需要为国家创建一个Pojo? 如何将下面的代码引用到不是pojo的“参考表”?
@OneToOne
@JoinColumn(name = "country_iso")
private String country;
上面的代码,是我开始编写的,但我不知道这是否是这样做的。
答案 0 :(得分:4)
我认为创建一个类Country
是一个好主意,使用iso代码作为id。
您需要建立多对一关系,因为一个国家/地区可以存在多个人。
国家:
@Id
String id;
人:
@ManyToOne
@JoinColumn(name="COUNTRY", referencedColumnName="ID")
Country country;
通过这种方式,您可以使用Hibernate将所有国家/地区加载为集合,并且可以为关系设置规则(如optional = false等)
答案 1 :(得分:3)
我建议您为国家/地区创建一个实体
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@org.hibernate.annotations.Entity(mutable=false) //since this table is supposed to
@Table(name="Countries")
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class Country{
@Id
String ccode;
String name;
}
通过此映射,您可以将Country pojo映射到表国家/地区,并将此实体设置为不可变且已启用的2L缓存(这是使用只读策略启用2L缓存的最佳情况)
答案 2 :(得分:1)
在这种情况下,您可以按照以下方法操作。我假设您不会在运行时插入Country
表。
在Person
班级中为countryId设置一个字段。
@Column(name = "country_iso")
private String countryId;
如果要将Person
保存到数据库,请根据国家/地区名称(来自数据库)获取countryId,并将其设置为Person
的countryId。然后保存Person
。
您可以拥有Country
的POJO,并在需要时在Person
课程中引用它。