2012-04-27 98 views
2

我想刪除JPA/Hibernate配置中的實體。數據庫是一個嵌入式HSQL文件。休眠:無法刪除實體

這是代碼做刪除:

 EntityManager em = PersistenceUtility.getInstance().createEntityManager(); 
     EntityTransaction t = em.getTransaction(); 
     t.begin(); 

     List<ServiceTicket> tickets = em.createQuery("from ServiceTicket").getResultList(); 

     for (ServiceTicket ticket : tickets) { 
      Report report = ticket.getReport(); 
      em.merge(report); 
      em.merge(ticket); 
      em.remove(report); 
      em.remove(ticket); 
     } 

     em.flush(); 
     t.commit(); 

ServiceTicket引用entitiy Report。這就是爲什麼我必須先刪除Report

在這種情況下我沒有收到錯誤信息。但是這些更改不會寫入數據庫。

這裏是持久性單元的配置:

<persistence-unit name="local_hsql" transaction-type="RESOURCE_LOCAL"> 
<provider>org.hibernate.ejb.HibernatePersistence</provider> 
<class>Report</class> 
<class>ServiceTicket</class> 
<properties> 
    <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/> 
    <property name="hibernate.connection.url" value="jdbc:hsqldb:file:etc/database/db1"/> 
    <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> 
    <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/> 
    <property name="hibernate.show_sql" value="false"/> 
    <property name="hibernate.connection.SetBigStringTryClob" value="true"/> 
    <property name="hibernate.hbm2ddl.auto" value="update"/> 
</properties> 

我在做什麼錯?

提前感謝和問候來自德國

馬爾科

+1

Acouple:有沒有需要合併的entites,他們已經進行管理。另外請記住,合併返回一個託管實體,但對作爲參數傳遞的對象沒有任何作用。因爲您在之後提交行中的更改,所以不需要刷新。另一種(更簡單的)方法是在報表中聲明ServiceTicket的映射爲cascade = CascadeType.REMOVE(或ALL),並且只在報表上調用em.remove()。也許EntityManager有問題。有沒有什麼工作與這個時間? (就像它在這段代碼中找到Reports一樣)(打開show sql) – esej 2012-04-27 09:52:16

回答

2

可以使用

@OneToOne(cascade = CascadeType.REMOVE) 

它會刪除報告時刪除ServiceTicket。

二: 如果你想刪除所有ServiceTickets那裏的東西等於x您可以使用HQL:

的意見
Query query = session.createQuery("delete ServiceTicket where something = :x"); 
query.setParameter("x", "myvalue"); 
int result = query.executeUpdate(); 
+0

我沒有Session。我到目前爲止一切都與EntityManager ... – 2012-04-27 09:49:59

+0

@MarcoNätlitz,沒關係,你仍然可以使用HQL和CascadeType.Remove與EntityManager。我只是寫了你應該做的事情的例子。只需使用EntityManager實現它。 – 2012-04-27 09:58:01