原文: https://howtodoinjava.com/hibernate/hibernate-4-example-to-get-entity-reference-for-lazy-loading/

    根据 Wikipedia 的定义, 延迟加载是一种设计模式,通常用于计算机编程中,以将对象的初始化推迟到需要的时间点。 我们知道,在 Hiberate 映射中,可以通过在 Hiberate 映射注解中指定fetch = FetchType.LAZY来完成延迟加载。 例如:

    1. @ManyToOne ( fetch = FetchType.LAZY )
    2. @JoinColumns( {
    3. @JoinColumn(name="fname", referencedColumnName = "firstname"),
    4. @JoinColumn(name="lname", referencedColumnName = "lastname")
    5. } )
    6. public EmployeeEntity getEmployee() {
    7. return employee;
    8. }

    关键是仅在定义两个实体之间的映射时才应用它。 如果已经在DepartmentEntity中定义了以上实体,则如果您获取DepartmentEntity,则EmployeeEntity将被延迟加载。

    但是,如果您要延迟加载DepartmentEntity本身,即主实体本身应延迟加载,该怎么办。

    可以通过在IdentifierLoadAccess类中使用getReference()方法解决此问题。

    让我们通过此示例了解用法。

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

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

    现在,我有一个主实体类EmployeeEntity,它可以具有多个属性以及与其他实体的映射。

    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. session.getTransaction().commit();
    15. session.close();
    16. session = HibernateUtil.getSessionFactory().openSession();
    17. session.beginTransaction();
    18. //Get only the reference of EmployeeEntity for now
    19. EmployeeEntity empGet = (EmployeeEntity) session.byId( EmployeeEntity.class ).getReference( 1 );
    20. System.out.println("No data initialized till now; Lets fetch some data..");
    21. //Now EmployeeEntity will be loaded from database when we need it
    22. System.out.println(empGet.getFirstName());
    23. System.out.println(empGet.getLastName());
    24. session.getTransaction().commit();
    25. HibernateUtil.shutdown();
    26. }
    27. }
    28. Output in console:
    29. Hibernate: insert into Employee (EMAIL, FIRST_NAME, LAST_NAME) values (?, ?, ?)
    30. No data initialized till now; Lets fetch some data..
    31. Hibernate: select employeeen0_.ID as ID1_0_0_, employeeen0_.EMAIL as EMAIL2_0_0_, employeeen0_.FIRST_NAME as FIRST3_0_0_,
    32. employeeen0_.LAST_NAME as LAST4_0_0_ from Employee employeeen0_ where employeeen0_.ID=?
    33. demo
    34. user

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

    祝您学习愉快!