我一直在查看各种 hibernate 教程和示例,对于它们的标识/主键属性,有些使用 Java 原始类型,有些使用包装类型,即;
private int id;
vs
private Integer id;
为什么以及何时使用其中一个作为实体键?
从 Hibernate 的角度来看,它不会改变任何东西,因为 Hibernate 使用相同的 Hibernate 类型来表示它们。
然而,正如 Bytecode Ninja 所指出的,你无法区分原始 int 的默认值0
从指定的0
虽然a不可能有歧义null
(a null
id 总是意味着一个新实体),这就是为什么我更喜欢使用可为空的包装类型。
这是 Hibernate 的建议。来自参考文档:
4.1.2.提供标识符属性(可选) http://docs.jboss.org/hibernate/core/3.3/reference/en/html/persistent-classes.html#persistent-classes-pojo-identifier
Cat 有一个名为 id 的属性。这
属性映射到主键
数据库表的列。这
财产可能被称为
任何东西,它的类型可能是
任何原始类型,任何原始类型
“包装”类型,java.lang.String 或
java.util.Date。如果你的遗产
数据库表有复合键,你
可以使用用户定义的类
这些类型的属性(参见
稍后关于复合标识符的部分
在章节中。)
标识符属性严格
选修的。你可以把它们放在一边
让 Hibernate 跟踪对象
内部标识符。我们不
不过推荐这个。
事实上,有些功能是
仅适用于声明的类
标识符属性:
- 分离对象的传递性重新附加(级联更新或级联
合并)-参见第 10.11 节,
“传递持久性”
- Session.saveOrUpdate()
- 会话.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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)