2

I'm learning JPA. In the code below I'm trying to persist Point, then list Points to check and it turns out that it haven't been saved. Why?

Thank you!

    PersistenceProvider provider = new PersistenceProvider();
    EntityManagerFactory emf = provider.createEntityManagerFactory("sample", null);

    EntityManager em = emf.createEntityManager();
    // DROP TABLE POINT
    // CREATE TABLE POINT (ID BIGINT NOT NULL, X DOUBLE, Y DOUBLE, PRIMARY KEY (ID))
    // DELETE FROM SEQUENCE WHERE SEQ_NAME = 'SEQ_GEN'
    // SELECT * FROM SEQUENCE WHERE SEQ_NAME = 'SEQ_GEN'
    // INSERT INTO SEQUENCE(SEQ_NAME, SEQ_COUNT) values ('SEQ_GEN', 0)


    Point p = new Point(1, 1);
    em.persist(p);
    // UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
    //   bind => [2 parameters bound]
    // SELECT SEQ_COUNT FROM SEQUENCE WHERE SEQ_NAME = ?
    //   bind => [1 parameter bound]
    em.close();


    EntityManager em2 = emf.createEntityManager();
    Query query = em2.createQuery("select p from Point p");
    List list = query.getResultList();
    // SELECT ID, X, Y FROM POINT
    System.out.println("Found objects: " + list.size());
    // Found objects: 0
    for (Object elt: list){
        System.out.println(elt);
    }

Whole project: https://github.com/greenmarker/EclipseLinkTest

rzo1
  • 5,561
  • 3
  • 25
  • 64
greenmarker
  • 1,599
  • 1
  • 21
  • 29

1 Answers1

2

Since you have no transaction there, then nothing is committed.

Some JPA providers will allow "non-transactional" writes (what you're trying to do there, e.g DataNucleus JPA), but many won't, so you need to do

em.getTransaction().begin();

... (persist, merge, remove calls)

em.getTransaction().commit();

if you want vendor-independent persistence code

Neil Stockton
  • 11,383
  • 3
  • 34
  • 29