2016-02-26 6 views
0

У меня возникла проблема с JPA и сохранением данных в базе данных. У меня есть следующий классJPA EntityManager не сохраняется

public class Grabber { 

    private EntityManagerFactory emfactory; 
    private EntityManager entitymanager; 

    public EntityManager getManager(){ 
     emfactory = Persistence.createEntityManagerFactory("DSLTestV4"); 
     entitymanager = emfactory. 
       createEntityManager(); 
     entitymanager.getTransaction().begin(); 
     return entitymanager; 

    } 

    public void Close(){ 
     entitymanager.getTransaction().commit(); 
     entitymanager.close(); 
     emfactory.close(); 
    } 

} 

А следующий которым расширяет граббер

public class TestfixtureGrabber extends Grabber{ 

    public List<Testfixture> getAll(){ 

     EntityManager manager = getManager(); 
     List<Testfixture> result = manager.createNamedQuery("Testfixture.findAll").getResultList(); 
     Close(); 
     return result;  
    } 

    public Testfixture getById(int id){ 
     EntityManager manager = getManager(); 
     TypedQuery<Testfixture> query = manager.createQuery("SELECT w FROM User w WHERE w.user=" +id ,Testfixture.class); 

     Testfixture result = query.getSingleResult(); 
     Close(); 
     return result; 
    } 

    @Transactional 
    public int SaveTestfixture(Testfixture t){ 
     EntityManager em = getManager(); 
     em.persist(t); 
     em.flush(); 
     int id = t.getId(); 
     em.close(); 
     return id; 
    } 

} 

Краткого операции работает нормально, и когда я сохранить объект получает идентификатор, и каким-то образом сохраняется в локальный контекст. Но когда я проверяю свою базу данных MySQL, он говорит, что таблица представляет собой пустой набор. Данные не сохраняются в базе данных.

Я пробовал разные вещи и пытался добавить flush() после сохранения, но не повезло.

Почему я не могу заставить эту работу работать? Есть идеи?

+0

так вы закрыть EntityManager до совершения сделки? –

+0

Вы не совершаете транзакции. Кроме того, EMF следует создавать один раз и только один раз. Создание это дорогостоящая операция, которая считывает все метаданные, аннотации и т. Д. Вы также должны соблюдать соглашения об именах Java, использовать try-finally, чтобы убедиться, что em всегда закрыт и т. Д. –

ответ

2

В SaveTestfixture(Testfixture t)

вы хотите, чтобы не использовать em.close(); но Close();

Также почему этот метод с аннотацией @Transactional

+0

Нет, но я SCARY –

+0

Да ! Конечно, не могу сказать, как я это пропустил! Фантастика! :) Это аннотируется, потому что я переборщил все подряд. Даже опустил молитву. Спасибо Страшный Вомбат (Y): D –

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