1
package org.example;

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;

public class Main
{
    public static void main(String[] args)
    {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");
        EntityManager entityManager = emf.createEntityManager();

        entityManager.getTransaction().begin();

        UserInfo userInfo = new UserInfo();
        userInfo.setUserName("User 1");
        userInfo.setHappy(true);
        userInfo.setStatus(Status.SINGLE);

        entityManager.persist(userInfo);

        entityManager.getTransaction().commit();

        UserInfo info = entityManager.find(UserInfo.class,1);
        System.out.println(info);

        entityManager.close();
    }
}
public enum Status {

    SINGLE, COMMITTED, MARRIED
}
public class Main
{
    public static void main(String[] args)
    {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");
        EntityManager entityManager = emf.createEntityManager();

        entityManager.getTransaction().begin();

        UserInfo userInfo = new UserInfo();
        userInfo.setUserName("User 1");
        userInfo.setHappy(true);
        userInfo.setStatus(Status.SINGLE);

        entityManager.persist(userInfo);

        entityManager.getTransaction().commit();

        UserInfo info = entityManager.find(UserInfo.class,1);
        System.out.println(info);

        entityManager.close();
    }
}

Persistence.xml :

<persistence xmlns="https://jakarta.ee/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0"
             xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd">
    <persistence-unit name="my-persistence-unit">
        <description>JPA In Action</description>
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name = "jakarta.persistence.jdbc.url"
                      value = "jdbc:mysql://localhost/JPA-In-Action"/>
            <property name = "jakarta.persistence.jdbc.user" value = "root"/>
            <property name="jakarta.persistence.jdbc.password" value="1234"/>
            <property name="jakarta.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="hibernate.show_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

pom.xml :

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>JPA-In-Action</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>JPA-In-Action</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>19</maven.compiler.source>
    <maven.compiler.target>19</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>6.1.7.Final</version>
    </dependency>

    <dependency>
      <groupId>jakarta.xml.bind</groupId>
      <artifactId>jakarta.xml.bind-api</artifactId>
      <version>4.0.0</version>
    </dependency>


    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.32</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

Output :
Hibernate: insert into user (happy, status, name) values (?, ?, ?)

Hibernate: select u1_0.id,u1_0.happy,u1_0.status,u1_0.name from user u1_0 where u1_0.id=?

org.example.UserInfo@22ad1bae

I was expecting to see that 'status' and 'name' would be fetched Lazily from the database. But, as per the query in the output, it is not getting fetched lazily , despite the fact I have stated @Basic(fetch = FETCHTYPE.LAZY) above a String and a enum field. I am using Hibernate (version : 6.1.7.Final) as the JPA implementation
I have tired by inserting @Lob annotation and also by putting @Basic(fetch = FETCHTYPE.LAZY) on method of getters and setters. None of them worked.

Can anyone please help me out with this ?

1 Answers1

0

As per the documentation:

... Attributes with FetchType.LAZY may or may not have been loaded.

So, as @andrey-b-panfilov suggests in his comment, the FetchType.LAZY is a hint to the persistence provider.

Worth noting, by the way, that the opposite isn't true. The FetchType.EAGER forces the provider to retrieve the annotated data immediately.

Mauricio Buffon
  • 332
  • 1
  • 8