Hibernate и дочерние объекты (добавить против очистки) - PullRequest
1 голос
/ 18 июня 2010

Допустим, у меня есть модель домена с автомобилем и колесами.Колеса - это список колес Колеса имеют отношение «один к одному» с автомобилем.

Если я возвращаю объект из Hibernate и у него 4 колеса.Я беру этот объект, удаляю 4 колеса и добавляю 4. И затем сохраняю.
Если я снова спрашиваю у Hibernate объект, и он возвращает авто с 8 колесами ... что мы делаем не так?У меня нет доступа к источнику в течение нескольких дней, но я хочу дать нашим разработчикам Java толчок в правильном направлении.Спасибо.

Ответы [ 2 ]

1 голос
/ 18 июня 2010

Я верю, но не уверен на 100%, что это зависит от свойства cascade коллекции.Например, если у вас есть:

<hibernate-mapping package="com.foo">
  <class name="Automobile">
  ...
    <set name="Wheels" cascade="delete-orphan"> <!-- or "all-delete-orphan" -->
      ...
    </set>
  </class>
</hibernate-mapping>

Тогда это, вероятно, сделает это.

0 голосов
/ 18 июня 2010

Ваш вопрос звучит как коллекция класса @Embeddable, где жизненный цикл компонента (деталь - колесо) привязан к жизненному циклу его экземпляра сущности-владельца (Automobile)

@Entity
public class Automobile {

    private Integer id;

    private Set<Wheels> wheelsSet = new HashSet<Wheels>();

    @Id
    @GeneratedValue
    public Integer getId() {
        return this.id;
    }

    @CollectionsOfElements
    @JoinTable("AUTO_WHEELS")
    public Set<Wheels> getWheelSet() {
        return this.wheelsSet;
    }

}

Если вы делаете

Automobile auto = session
                  .createQuery("from Automobile a left join fetch a.wheelSet where a.id = :id")
                  .setParameter("id", id)
                  .list().get(0);

И

/**
  * All of wheels removed
  */       
auto.getWheelSet().clear();

/**
  * New Wheels added
  */  
auto.getWheelSet().add(new Wheel());
auto.getWheelSet().add(new Wheel());
auto.getWheelSet().add(new Wheel());
auto.getWheelSet().add(new Wheel());

session.update(auto);

Он удовлетворит ваши потребности. Но имейте в виду, вы должны предоставить equals и реализацию hashCode Для нормальной работы

@Embeddable
public class Wheel implements Serializable {

    /**
      * equals and hashCode goes here
      * Prefer To use business key
      */

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...