Многие к одному (отношение типа элемента): идентификатор был изменен с x на y - PullRequest
1 голос
/ 23 августа 2011

У меня есть 2 класса Item & Type. Предмет принадлежит одному типу.

Работает нормально. Но когда я пытаюсь изменить ТИП уже сохраненного элемента , выдается ошибка:

идентификатор экземпляра com.myapp.model.Type был изменен с 1 до 2.

Кажется, что Hibernate думает, что я пытаюсь отредактировать идентификатор Тип . На самом деле, я хочу изменить тип элемента, а не редактировать тип, в котором он находится. Для быстрого примера, у меня есть название элемента «Шар», относящийся к типу «спорт», но теперь я хочу изменить его на «Инструмент» " тип. И Hibernate думает, что я хочу изменить имя (и Id) типа «Спорт» на «Инструмент»!

Псевдокод:

Item item = getItemFromDatabase(itemId);
item.setType(newType);
saveItem(item);

Мои файлы сопоставления:

<hibernate-mapping>
    <class name="com.myapp.model.Item" table="ITEM">
        <cache usage="read-write"/>
        <id name="id" column="ID">
            <generator class="sequence">
                <param name="sequence">item_seq</param>
            </generator>
        </id>

        <property name="name" column="NAME"/>
        <many-to-one name="type" 
             class="com.myapp.model.Type"
             column="type_id" 
             foreign-key="ITEM_TYPE_FK"
              />

        <property name="description" column="DESCRIPTION"/>
    </class>
</hibernate-mapping>

И

<hibernate-mapping>
    <class name="com.myapp.model.Type" table="TYPE">
        <cache usage="read-write"/>
        <id name="id" column="ID">
            <generator class="sequence">
                <param name="sequence">type_seq</param>
            </generator>
        </id>

        <property name="name" column="NAME"/>
    </class>
</hibernate-mapping>

Я что-то не так понимаю?

ОБНОВЛЕНИЕ:

У меня есть служебная функция Hibernate, подобная этой:

    @Override
    @SuppressWarnings("unchecked")
    public <T> T getById(Class<T> entityClass, Serializable id) {
        try {
            Object result = this.sessionFactory.getCurrentSession().get(entityClass, id);
            if (result != null) {
                return (T)result;
            } else {
                return null;
            }
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            throw new DataAccessException(e);
        }
    }

Тогда в моем коде я просто звоню:

Type updatedType = repository.getById(Type.class, item.getType().getId());

1 Ответ

1 голос
/ 23 августа 2011

То, что я считаю правильным, это

Item item = getItemFromDatabase(itemId);
item.setType(getItemTypeFromDatabase(newTypeId));
saveItem(item);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...