2012-04-27 4 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> 

Что я делаю неправильно?

Заранее спасибо и привет из Германии

Marco

+1

Acouple комментариев: Там нет необходимости объединить entites, они уже успели. Также имейте в виду, что merge возвращает управляемый объект, но ничего не делает для объекта, переданного как аргумент. Нет необходимости выполнять флеш, поскольку вы фиксируете изменения в строке после. Другой (более простой) подход должен был бы объявить отображение ServiceTicket как cascade = CascadeType.REMOVE (или ALL) в отчете и только вызвать em.remove() в отчете. Возможно, что-то не так с EntityManager. Работает ли что-нибудь с этим? (как в ней найти отчеты в этом фрагменте кода?) (включить show sql) – esej

ответ

2

вы можете использовать

@OneToOne(cascade = CascadeType.REMOVE) 

Это удалит отчет при удалении ServiceTicket.

Второе: Если вы хотите удалить все ServiceTickets где-то равен х вы можете использовать HQL:

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

У меня нет сеанса. Я делаю все с EntityManager до сих пор ... –

+0

@ MarcoNätlitz, это не имеет значения, вы все еще можете использовать HQL с и CascadeType.Remove с EntityManager. Я просто написал вам пример того, что должно быть сделано. Просто реализуйте его с помощью EntityManager. –

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