为DB中的唯一名称创建其他ID?

时间:2014-01-09 11:45:33

标签: java database hibernate

我想创建一个应该包含许多唯一名称的数据库表,这些名称可以被其他表引用。

示例:

table Country:
Germany
USA
France

我应该将这些名称的字符串标记为@Id,还是引入另一个Long id

@Entity
class Country {
    //@Id private Long id;

    @Id private String name; //eg 'Germany'
}

@Entity
class Address {
    @ManyToOne
    private Country country;
}

我认为最好让Id引用名称,以便在Country表中的外键中不重复这些名称?或者这不重要吗?

如果新地址没有String country字段,而只是对该国家的引用(因为相同的国家/地区名称将在多个地址中重复使用,因此没有相应的国家/地区名称条目),是否有任何优势?地址表)。

但是我可以想象一个缺点可能是我在持久地址之前没有国家标识。因此,我首先要检查SELECT * FROM Country WHERE name := name,检查是否==null并创建新的国家/地区条目,然后创建Address

你认为在这里使用String或Long作为Id更好吗?

2 个答案:

答案 0 :(得分:1)

我会使用Long Id。

我会避免使用字符串,因为国家/地区名称不是常数:它们已知会发生变化,并且必须更改所有外键值。

我会避免枚举路由,因为它需要您更改/重建/重新编译以处理新的国家/地区或国家/地区名称更改。

答案 1 :(得分:0)

另一种选择是使用所有国家/地区的名称定义enum并在您的实体中使用它。这些值保证是唯一的,并且更简单,并且不需要在每个查询上添加额外的表和多余的连接:

public enum Country {
Germany, USA, France
}

在您的实体中:

@Enumerated(EnumType.STRING)
private Country country;