2015-10-18 62 views
-1

我想刪除一個對象使用EntityManager,一切工作正常,沒有錯誤,但當我在數據庫中做一些查詢對象返回,而不是在數據庫中刪除。對象沒有物理刪除JPA

我的EntityManager注入:

public class CdiApplicationConfig { 

    @Inject 
    private EntityManagerFactory emf; 

    @Produces 
    @ApplicationScoped 
    public EntityManagerFactory createEntityManagerFactory() { 
     EntityManagerFactory emf = Persistence.createEntityManagerFactory("generalPU"); 
     return emf; 
    } 

    public void close(@Disposes EntityManagerFactory emf) { 
     emf.close(); 
    } 

    @Produces 
    @TransactionAttribute // is a bit better than @RequestScoped because it won't allow perform injection outside transaction context 
    public EntityManager createEntityManager() { 
     return emf.createEntityManager(); 
    } 

    public void close(@Disposes EntityManager em) { 
     if (em.isOpen()) { 
      em.close(); 
     } 
    } 
} 

見我的刪除操作:

@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public void delete(Bean bean) { 
    try { 
     bean = entityManager.merge(bean); 
     entityManager.remove(bean); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     throw new DAOException("Ocorreu um erro ao tentar deletar"); 
    } 
    } 

正如我所說的,有沒有錯誤,但BEAN沒有物理刪除。我正在使用JPA/Hibernate + CDI。

編輯1:

我解決了生產中的應用管理的事務這樣的問題:)

begin(); 
     bean = entityManager.merge(bean); 
     entityManager.flush(); 
     entityManager.refresh(bean); 
     commit(); 

哪裏開始()和commit(使用EntityManager.getTransaction()

+0

試圖刪除實體的代碼不在它應該用於執行刪除操作的事務上下文中。 – Tiny

+3

您正在從'EntityManagerFactory'獲得'EntityManager',在這種情況下,您沒有使用容器管理的'EntityManager',而@ TransactionAttribute'被忽略。使用容器管理的'EntityManager'。如果由於某些原因它不是一個選項,那麼你將不得不手動開始和提交事務(使用'UserTransaction'或其他)或使用'javax.transaction.Transactional'來使CDI託管bean事務性。 – Tiny

+0

我使用EJB作爲容器管理,我讓Spring使用CDI。我不明白爲什麼TrasactionAttribute被忽略。 – RonaldoLanhellas

回答

0

其中一種方式就像下面手動處理交易一樣... 但是,如果您使用spring,則可以配置事務,因此您無需處理每種方法中的交易處理d

@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public void delete(Bean bean) { 
    try { 
     bean = entityManager.merge(bean); 

     EntityTransaction tx = entityManager.getTransaction(); 
     tx.begin(); 

     entityManager.remove(bean); 

     tx.commit(); 

     } catch (Exception e) { 
     e.printStackTrace(); 
     throw new DAOException("Ocorreu um erro ao tentar deletar"); 
    } 
    }  
+0

如果此代碼寫入EJB(如@ TransactionAttribute所示),該方法將使用容器管理的全局(分佈式)JTA事務並且不喜歡特定於資源的本地事務(EJB不允許資源相關的事務)與'UserTransaction'不同,'EntityManager#getTransaction()'檢索資源本地事務,這是EJB中不允許的資源本地事務,因爲它們使用JTA)。 – Tiny