我想创建一个应该包含许多唯一名称的数据库表,这些名称可以被其他表引用。
示例:
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更好吗?
答案 0 :(得分:1)
我会使用Long Id。
我会避免使用字符串,因为国家/地区名称不是常数:它们已知会发生变化,并且必须更改所有外键值。
我会避免枚举路由,因为它需要您更改/重建/重新编译以处理新的国家/地区或国家/地区名称更改。
答案 1 :(得分:0)
另一种选择是使用所有国家/地区的名称定义enum
并在您的实体中使用它。这些值保证是唯一的,并且更简单,并且不需要在每个查询上添加额外的表和多余的连接:
public enum Country {
Germany, USA, France
}
在您的实体中:
@Enumerated(EnumType.STRING)
private Country country;