具有休眠的国家代表

时间:2011-11-10 20:26:35

标签: java hibernate dao hibernate-annotations

我正在将我的JDBC项目迁移到Hibernate。 我对存储在我的数据库中的参考数据有疑问,特别是它是联合国国家名单。 我是从here获得的。

当我使用JDBC时,我只有一个包含该数据的表,而我曾经用它来验证数据库中的数据。例如,用户无法输入他居住在该表中不存在的国家。

现在,我有一个代表一个人的Pojo,我有一个代表一个国家的字符串成员,我如何坚持Hibernate,我是否需要为国家创建一个Pojo? 如何将下面的代码引用到不是pojo的“参考表”?

@OneToOne
@JoinColumn(name = "country_iso")
private String country;

上面的代码,是我开始编写的,但我不知道这是否是这样做的。

3 个答案:

答案 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课程中引用它。