Search code examples
databaseeclipselinkh2

Problem with H2 Database using EcipseLink (Program doesnt change database even without a error)


So ... I just started using databases and my brother recommended me to use H2 with EclipseLink to start. Did a quick Google search and found a Tutuorial:

  1. https://www.javatips.net/blog/eclipselink-jpa-with-h2-database

  2. https://www.javatips.net/blog/java-persistence-jpa-2-0-tutorial-with-eclipselink

If I code it like it is described in the Tutorial i get no error when i run it, but i check the database my Table is still empty. I searched for like a week now but i dont find an answer.

My Code:

Class Student

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "STUDENT")
public class Student implements java.io.Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "STUDENTID")
  private long studentId;

  @Column(name = "STUDENTNAME")
  private String studentName;

  public void setStudentId(long studentId) {
      this.studentId = studentId;
  }

  public long getStudentId() {
      return studentId;
  }

  public void setStudentName(String studentName) {
      this.studentName = studentName;
  }

  public String getStudentName() {
      return studentName;
  }
}

JPAExample

import java.util.Iterator;
import java.util.List;
import javax.persistence.EntityManager;



public class JPAExample {

    private EntityManager entityManager = EntityManagerUtil.getEntityManager();

    public static void main(String[] args) {
        JPAExample example = new JPAExample();
        System.out.println("After Sucessfully insertion ");
        Student student1 = example.saveStudent("Sumith");
        Student student2 = example.saveStudent("Anoop");
        example.listStudent();
        System.out.println("After Sucessfully modification ");
        example.updateStudent(student1.getStudentId(), "Sumith Honai");
        example.updateStudent(student2.getStudentId(), "Anoop Pavanai");
        example.listStudent();
        System.out.println("After Sucessfully deletion ");
        example.deleteStudent(student2.getStudentId());
        example.listStudent();


    }

    public Student saveStudent(String studentName) {
        Student student = new Student();
        try {
            entityManager.getTransaction().begin();
            student.setStudentName(studentName);
            student = entityManager.merge(student);
            entityManager.getTransaction().commit();
        } catch (Exception e) {
            entityManager.getTransaction().rollback();
        }
        return student;
    }

    public void listStudent() {
        try {
            entityManager.getTransaction().begin();
            @SuppressWarnings("unchecked")
            List<Student> Students = entityManager.createQuery("from Student").getResultList();
            for (Iterator<Student> iterator = Students.iterator(); iterator.hasNext();) {
                Student student = (Student) iterator.next();
                System.out.println(student.getStudentName());
            }
            entityManager.getTransaction().commit();
        } catch (Exception e) {
            entityManager.getTransaction().rollback();
        }
    }

    public void updateStudent(Long studentId, String studentName) {
        try {
            entityManager.getTransaction().begin();
            Student student = (Student) entityManager.find(Student.class, studentId);
            student.setStudentName(studentName);
            entityManager.getTransaction().commit();
        } catch (Exception e) {
            entityManager.getTransaction().rollback();
        }
    }

    public void deleteStudent(Long studentId) {
        try {
            entityManager.getTransaction().begin();
            Student student = (Student) entityManager.find(Student.class, studentId);
            entityManager.remove(student);
            entityManager.getTransaction().commit();
        } catch (Exception e) {
            entityManager.getTransaction().rollback();
        }
    }
}

EntityManagerUtil

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;


public class EntityManagerUtil {
    private static final EntityManagerFactory entityManagerFactory;
    static {
        try {
            entityManagerFactory = Persistence.createEntityManagerFactory("test");

        } catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static EntityManager getEntityManager() {
        return entityManagerFactory.createEntityManager();

    }
}

Persistence.xml

<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
         version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="test" transaction-type="RESOURCE_LOCAL">
    <class>Student</class>
    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
        <property name="javax.persistence.jdbc.url"    value="jdbc:h2:~/test" />
        <property name="javax.persistence.jdbc.user" value="sa" />
        <property name="javax.persistence.jdbc.password" value="" />
        <property name="eclipselink.ddl-generation" value="create-tables"/>
        <property name="eclipselink.ddl-generation.output-mode" value="database" />
    </properties>
</persistence-unit>

When i run the JPAExample i get this output: My Output

But the expected Output should look like this: Expected Output

And if i look into the H2 Database nothing has changed: H2 Database Interface (German Language)

Hope someone can help me or can link me a usefull/better JPA Tutorial :)


Solution

  • You are catching exceptions but not acknowledging or logging them - you should make sure you at least log it.

    In this case, your listStudent method is getting an exception on

     entityManager.createQuery("from Student").getResultList()
    

    as this is an invalid JPQL query. You should be using something like:

    entityManager.createQuery("select s from Student s").getResultList()