У меня есть 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());