2012-02-05 53 views
5

我已经看到了这question在SO这往往对原语和领导也看到了这一个从coderanch这往往对包装导致。两者都有点老了。我应该在JPA2.0中使用基元还是包装?

我没有任何特殊的需求只是想知道一个标准的良好做法。

网络上的示例也混合使用。 e.g有的用这样的:

@Id 
@Column(name = "CUSTOMER_ID") 
public long customerId; 

其他使用包装:

@Id 
@Column(name = "CUSTOMER_ID") 
public Long customerId; 

回答

6

两者之间的区别是空性。原始类型不能为null,而“Wrapped”类型可以为null。

我更喜欢使用包装类型,你可以告诉我们,如果对象已经保存/载入/从数据库中id的值是否为空。

我不认为这里有一个“最佳实践”,也许是风格问题?

+1

我说可为空“savedness”指标是非常好的做法。 (无论是ID还是版本/时间戳列。) – millimoose 2012-02-05 16:44:28

+0

+1,空值是一个重要的哨兵imo。我在所有实体对象中使用包装都是出于同样的原因。 – Perception 2012-02-05 17:41:45

+0

所以它是一个包装是首选的ID版本或时间戳,但不为别人? – 2012-02-09 10:18:27

1

如果使用原语,它会永远保持默认值,在这种情况下0L长时间,即使该值不存在于数据库中。如果你使用包装器对象,它将会有一个空值,如果该值不在数据库中,或者实体没有被保存。

+0

IIRC,如果您尝试从已经映射到基元成员的列中的数据库中读取具有空值的对象,则会收到运行时错误。所以它不仅仅是插入默认值。 – Bill 2012-02-05 16:29:14

0

我认为答案被包含在@Column注解中的可空元素中。如果它可以是可以为空的比包装原始是可以的。但是在nullable = false列(因为ID是)基元更好。你将得到额外的检查,因为null不能被转换为int/long。

3

休眠建议您:

我们建议您对持久类声明命名一致的标识属性 和你使用一个可以为空(即 非原始)类型。 more

+3

这只是标识符属性而不是一般性建议。 – joecoder 2016-02-24 18:48:03

0

从Hibernate的角度来看,它并没有改变任何东西,因为Hibernate使用相同的Hibernate类型来表示它们。但是,正如Bytecode Ninja所指出的那样,您不能区分默认值int 0和默认值0,而不存在可能的空值(null id始终表示新实体)这就是为什么我更喜欢使用可空的包装类型。

这是Hibernate的建议。从参考文档:

4.1.2。提供标识符属性(可选)

Cat有一个名为id的属性。该属性映射到数据库表的主键列。该属性可能被称为任何东西,其类型可能是任何原始类型,任何原始的“包装”类型,java.lang.String或java.util.Date。如果你的遗留数据库表有联合主键,你可以使用这些类型的属性的用户定义的类(见关于联合标识符在本章后面的部分。)

标识符属性是可选的。您可以将它们关闭,让Hibernate在内部跟踪对象标识符。但是,我们不建议这样做。

实际上,一些功能只对那些声明了标识符属性的类:

传递复位对脱管对象(级联更新或级联合并) - 见10.11,“传递坚持” Session.saveOrUpdate( ) Session.merge() 我们建议您在持久化类上声明一致命名的标识符属性,并且使用可空(即非基元)类型。

实际上我在我的基类利用此:

@MappedSuperclass 
public class BaseEntity implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private Long id; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @Transient 
    public boolean isNew() { 
     return (this.id == null); 
    } 
} 

请点击这里查看更多详细信息:https://stackoverflow.com/posts/3537407/edit