我想刪除一個對象使用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()
試圖刪除實體的代碼不在它應該用於執行刪除操作的事務上下文中。 – Tiny
您正在從'EntityManagerFactory'獲得'EntityManager',在這種情況下,您沒有使用容器管理的'EntityManager',而@ TransactionAttribute'被忽略。使用容器管理的'EntityManager'。如果由於某些原因它不是一個選項,那麼你將不得不手動開始和提交事務(使用'UserTransaction'或其他)或使用'javax.transaction.Transactional'來使CDI託管bean事務性。 – Tiny
我使用EJB作爲容器管理,我讓Spring使用CDI。我不明白爲什麼TrasactionAttribute被忽略。 – RonaldoLanhellas