原文: https://howtodoinjava.com/hibernate/hibernate-naturalid-example-tutorial/

Hibernate 4 带来了许多改进, @NaturalId就是这样的改进之一。 如您所知,@Id注解用作指定实体主键的元数据。 但是有时,实体通常在 DAO 层代码中使用 ID,该 ID 不是主键,而是其逻辑或自然 ID。 在这种情况下,@NaturalId注解将证明是 Hiberate 下命名查询的良好替代。

例如,在任何应用中都可以有一个雇员实体。 在这种情况下,主键肯定是“员工 ID”,但在通过电子邮件登录等情况下,用户将提供电子邮件和密码。 在这种情况下,您可以直接在“电子邮件”字段上使用@NaturalId注解,而不必编写命名查询。

工作原理

如果您查看日志,那么您会知道,当您通过其自然 ID 获得实体时,

  1. 通过执行自然 ID 的where子句找到实体的第一个主键
  2. 该主键用于获取实体的信息

用法示例

让我们来看这个例子。

作为参考,最新的 Hiberate Maven 依赖项如下:

  1. <dependency>
  2. <groupId>org.hibernate</groupId>
  3. <artifactId>hibernate-core</artifactId>
  4. <version>4.3.0.Beta3</version>
  5. </dependency>

现在,最小员工实体应如下所示:

EmployeeEntity.java

  1. @Entity
  2. @Table(name = "Employee", uniqueConstraints = {
  3. @UniqueConstraint(columnNames = "ID"),
  4. @UniqueConstraint(columnNames = "EMAIL") })
  5. public class EmployeeEntity implements Serializable {
  6. private static final long serialVersionUID = -1798070786993154676L;
  7. @Id
  8. @GeneratedValue(strategy = GenerationType.IDENTITY)
  9. @Column(name = "ID", unique = true, nullable = false)
  10. private Integer employeeId;
  11. //Use the natural id annotation here
  12. @NaturalId (mutable = false)
  13. @Column(name = "EMAIL", unique = true, nullable = false, length = 100)
  14. private String email;
  15. @Column(name = "FIRST_NAME", unique = false, nullable = false, length = 100)
  16. private String firstName;
  17. @Column(name = "LAST_NAME", unique = false, nullable = false, length = 100)
  18. private String lastName;
  19. //Setters and Getters
  20. }

现在,让我们看看如何在代码中使用它:

TestHibernate.java

  1. public class TestHibernate
  2. {
  3. public static void main(String[] args)
  4. {
  5. Session session = HibernateUtil.getSessionFactory().openSession();
  6. session.beginTransaction();
  7. //Add new Employee object
  8. EmployeeEntity emp = new EmployeeEntity();
  9. emp.setEmail("demo-user@mail.com");
  10. emp.setFirstName("demo");
  11. emp.setLastName("user");
  12. //Save entity
  13. session.save(emp);
  14. EmployeeEntity empGet = (EmployeeEntity) session.bySimpleNaturalId( EmployeeEntity.class ).load( "demo-user@mail.com" );
  15. System.out.println(empGet.getFirstName());
  16. System.out.println(empGet.getLastName());
  17. session.getTransaction().commit();
  18. HibernateUtil.shutdown();
  19. }
  20. }
  21. Output in console:
  22. Hibernate: insert into Employee (EMAIL, FIRST_NAME, LAST_NAME) values (?, ?, ?)
  23. Hibernate: select employeeen_.ID as ID1_0_ from Employee employeeen_ where employeeen_.EMAIL=?
  24. Hibernate: select employeeen0_.ID as ID1_0_0_, employeeen0_.EMAIL as EMAIL2_0_0_, employeeen0_.FIRST_NAME as FIRST3_0_0_, employeeen0_.LAST_NAME as LAST4_0_0_ from Employee employeeen0_ where employeeen0_.ID=?
  25. demo
  26. user

要下载以上教程的源代码,请单击下面的下载链接。

祝您学习愉快!