有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用hibernate实现java国家/地区表示

我正在将我的JDBC项目迁移到Hibernate。 我有一个关于数据库中存储的参考数据的问题,特别是联合国国家列表。 我从here拿的

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

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

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

上面的代码是我开始编写的,但我不知道这是否是实现它的方法


共 (3) 个答案

  1. # 1 楼答案

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

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

    国家:

    @Id
    String id;
    

    人:

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

    通过这种方式,您可以使用Hibernate将所有国家作为一个集合加载,并且可以为关系设置规则(如optional=false等)

  2. # 2 楼答案

    我建议您为国家创建一个实体,如

    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;
    }
    

    通过此映射,您可以将国家pojo映射到表国家,还可以将此实体设置为不可变并启用2L缓存(这是使用只读策略启用2L缓存的最佳情况)

  3. # 3 楼答案

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

    Person类中有一个countryId字段

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

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

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