JPA实体ID - 长或长

时间:2013-12-06 10:34:17

标签: hibernate jpa types entity long-integer

您的实体的ID是(基本类型)还是(对象类型)?

  • ID是我的表的主键,在数据库中永远不会为'null'。
  • 我的同事建议使用长对象类型。
  • Hibernate Reverse Engeneering工具默认为id生成一个基本类型。

选择什么?长还是长?

@Entity
@Table(name = "COUNTRY")
public class CountryEntity implements java.io.Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "ID")
    private long id;
    @Column(name = "NAME")
    private String name;
    @Column(name = "CURRENCY")
    private String currency;
    @Column(name = "PEOPLE")
    private Long people;
    @Column(name = "SIZE")
    private Long size;

    public CountryEntity() {
    }

3 个答案:

答案 0 :(得分:23)

我认为让Long更好,因为通过检查null值来检查实体是否具有持久性身份更为正确(在MySQL中,您可以使用值为0的ID)。还有一些像Spring这样的库在它们的逻辑中基于Long类型的ID(默认情况下)。有关示例,请参阅此implementation

原语的一小优点:它占用的空间更少。

PS:两者都是正确的&根据JPA规范支持,这个问题的答案以某种方式基于意见。

答案 1 :(得分:4)

我更喜欢Long,原因很简单,如果你让数据库为你生成id(你应该),你可以通过检查id==null来判断最近实例化的CountryEntity对象是否仍然存在。如果使用long,则id将始终具有非空值(最初为0),这将在持久化实体时更改。

答案 2 :(得分:1)

我可能会因此而受到抨击,但两者都没有。除非您计划对它们执行数学计算,否则Id字段不应在Java中表示为数字类型。使用String代替,当你的id超过Long的容量时,你不会遇到溢出问题。另外,尝试将24位数的Long序列化为JSON,您将遇到麻烦。