我有 2 类元素和类型。一个项目属于一种类型。
工作正常。但是当我尝试更改已保存项目的类型时,会出现错误:
identifier of an instance of com.myapp.model.Type was altered from 1 to 2.
Hibernate 似乎认为我尝试编辑 Type 的 id。实际上,我想更改项目的类型,而不是编辑它所在的类型。举个简单的例子,我有一个项目名称“Ball”属于“sport”类型,但现在我想将其更改为“Tool”类型。并且 Hibernate 认为我想将“Sport”类型的名称(和 Id)更改为“Tool”!
伪代码:
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());
最佳答案
我认为正确的方式是
Item item = getItemFromDatabase(itemId);
item.setType(getItemTypeFromDatabase(newTypeId));
saveItem(item);
关于java - 多对一(项目-类型关系): identifer was change from x to y,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7156757/