【问题标题】:Country representation with hibernate使用休眠的国家/地区表示
【发布时间】:2011-11-10 20:26:35
【问题描述】:

我正在将我的 JDBC 项目迁移到 Hibernate。 我对存储在我的数据库中的参考数据有疑问,特别是它是联合国国家/地区列表。 我是从here 那里拿到的。

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

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

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

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

【问题讨论】:

  • 现在我比以前更困惑...

标签: java hibernate dao hibernate-annotations


【解决方案1】:

我认为创建一个类Country,使用iso 代码作为id 是个好主意。

您需要建立多对一的关系,因为一个国家可以存在多个人。

国家:

@Id
String id;

人:

@ManyToOne
@JoinColumn(name="COUNTRY", referencedColumnName="ID") 
Country country;

这样,您可以使用 Hibernate 将所有国家/地区作为集合加载,并且您可以为关系设置规则(如 optional=false 等)

【讨论】:

    【解决方案2】:

    我建议您为 Country 创建一个实体,例如

    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 缓存的最佳情况)

    【讨论】:

    • 听起来很有趣,2L 只读缓存策略究竟是如何工作的?
    【解决方案3】:

    在这种情况下,您可以遵循以下方法。我假设您不会在运行时插入 Country 表。

    Person 类中有一个 countryId 字段。

    @Column(name = "country_iso")
    private String countryId;
    

    当您想将Person 保存到数据库时根据国家名称(从数据库中)获取 countryId 并将其设置为Person 的 countryId。然后保存Person

    如果需要,您可以为 Country 创建一个 POJO,并在 Person 类中引用它。

    【讨论】:

      猜你喜欢
      • 2017-07-17
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多