2013-05-09 3 views
0

Я понимаю, что это довольно распространенная проблема с Hibernate, однако я все еще изо всех сил пытаюсь написать код, который функционирует правильно. В принципе, у меня есть два класса; Демографический и NextOfKin. Более поздняя часть связана с демографическим набором «один-ко-многим». Упрощенная:Hibernate Удаление членов набора в одном для многих отношений

<hibernate-mapping> 
      <class name="entities.Demographic" table="Demographics"> 

      <id name="id" type="long" column="Id" ><generator class="identity"/></id> 
      <set name="nextOfKinList" table="NextOfKin" inverse="true" lazy="true" fetch="select" cascade="all,delete-orphan" > 
       <key><column name="DemographicId" not-null="true" /></key> 
       <one-to-many class="entities.NextOfKin" /> 
      </set> 
     </class> 
</hibernate-mapping> 


<hibernate-mapping> 
     <class name="entities.NextOfKin" table="NextOfKin"> 
      <id name="id" type="long" column="Id" ><generator class="identity"/></id> 
      <many-to-one name="demographic" class="entities.Demographic" fetch="select"> 
       <column name="DemographicId" not-null="true" /> 
      </many-to-one> 
</hibernate-mapping> 

код, который я пытаюсь использовать удалить список NextOfKin следующим образом - снова упрощается:

try { 
     DAOFactory factory = DAOFactory.instance(DAOFactory.HIBERNATE); 
     HibernateUtil.beginTransaction(); 
     Demographic demographic = factory.getDemographicDAO().findDemographic();   

     if (!demographic.getNextOfKinList().isEmpty()) { 
      for (Iterator<NextOfKin> iterator = demographic.getNextOfKinList().iterator(); iterator.hasNext();) { 
       NextOfKin nextOfKin = iterator.next(); 
       factory.getNextOfKinDAO().delete(nextOfKin); 
       iterator.remove(); 
      } 
     } 
     demographic.setNextOfKinList(nextOfKinList); 
     HibernateUtil.commitTransaction(); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
     HibernateUtil.rollbackTransaction(); 
    } 
    finally { 
     HibernateUtil.closeSession(); 
    } 

Я попробовал несколько подходов, но все потерпели неудачу либо оставляя отношения нетронутыми или с текущим, например, бросание исключение:

org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance: entities.Demographic.nextOfKinList 

Извинения, как это довольно стандартный вопрос, но любая помощь будет оценена.

ответ

2

Вам просто нужно очистить набор: demographic.getNextOfKinList().clear(). Hibernate автоматически удалит элементы из базы данных, это роль delete-orphan.

if (!demographic.getNextOfKinList().isEmpty()) { 
    demographic.getNextOfKinList().clear();  
} 

И удалить строку: demographic.setNextOfKinList(nextOfKinList); Если вы хотите добавить новые элементы в коллекции, добавьте их к существующей коллекции:

demographic.getNextOfKinList().add(newElem)

+0

Perfect - спасибо – skyman

1

Вместо того чтобы удалять их один за другим, попробуйте это.

demographic.getNextOfKinList().clear(); 

demographic.getNextOfKinList().addAll(nextOfKinList); 
Смежные вопросы