2015-12-22 2 views
2

Я изучаю JPA. В приведенном ниже коде я пытаюсь сохранить Point, а затем список Points, чтобы проверить, и оказалось, что он не был сохранен. Зачем?Сущность не сохраняется с использованием EclipseLink

Спасибо!

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); 
    } 

Весь проект: https://github.com/greenmarker/EclipseLinkTest

ответ

2

Поскольку у вас нет сделки там, то ничего не совершается.

Некоторые JPA провайдеры позволяют «не-транзакционной» пишет (что вы пытаетесь сделать там, например, DataNucleus JPA), но многие из них не будет, так что вам нужно сделать

em.getTransaction().begin(); 

... (persist, merge, remove calls) 

em.getTransaction().commit(); 

если вы требуется не зависящий от поставщика код постоянства

Смежные вопросы