从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
我说可为空“savedness”指标是非常好的做法。 (无论是ID还是版本/时间戳列。) – millimoose 2012-02-05 16:44:28
+1,空值是一个重要的哨兵imo。我在所有实体对象中使用包装都是出于同样的原因。 – Perception 2012-02-05 17:41:45
所以它是一个包装是首选的ID版本或时间戳,但不为别人? – 2012-02-09 10:18:27