gpt4 book ai didi

java - hibernate 中索引和@NaturalId 的区别

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:49:53 26 4
gpt4 key购买 nike

有一些关于自然标识符的文章,我在那里读到自然标识符促进了对 hibernate 中最常用字段的查找。 In this post ,他们描述了自然标识符对于使用特定字段查找任何数据要好得多。他们还描述了自然标识符由 hibernate 索引,而 hibernate 通过使用该索引提高了查找性能。

据我所知,还有一些方法可以为特定字段创建索引,使用这种方法可以获得查找性能。那么使用自然标识符比一般索引有什么优势呢?

例如,我可以创建一个具有适当索引的实体类,

@Entity
@Table(name = "users", indexes = {
@Index(columnList = "username", name = "users_username")
})
public class User implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

@Column(name = "username", unique = true)
private String username;

@Column(name = "email_id")
private String email;

------------

}

我可以通过其他方式创建一个没有索引但具有自然标识符的实体,例如,

@Entity
@Table(name = "users")
public class User implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;

@NaturalId
@Column(name = "username", unique = true)
private String username;

@Column(name = "email_id")
private String email;

------------

}

根据定义,两者都以相同的方式工作,并且都在底层使用索引方法。那么从技术上讲,索引和自然标识符之间有什么区别?推荐使用哪种方法,它与另一种相比有何优势?

最佳答案

当您使用@NaturalId 时,Hibernate 将维护自然ID 到主键的映射。例如,如果您有如下所示的用户实体:

//This is pseudo-code

User {
@Id
long id;

@NaturalId
String username;
}

Hibernate 将存储哪些用户名映射到哪些 ID,这意味着如果一个实体已经与 session 对象相关联,Hibernate 可以通过自然 ID 从 session 中加载它。 (这个能力也可以扩展到二级缓存)。

索引将创建一个额外的列,使原始索引列的所有行按排序顺序排列。可以对索引列进行二分搜索,以减少查找时检查的行数。

我相信唯一约束会自动索引 Postgres 中的相应列。我个人同时使用唯一约束和自然 id 注释。

关于java - hibernate 中索引和@NaturalId 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45394955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com