java - 多对一(项目-类型关系): identifer was change from x to y

标签 java hibernate spring-mvc

我有 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/

相关文章:

java - 如何在java中显示10次方的科学记数法?

java - JPA/hibernate ORA-00932 : inconsistent datatypes: expected NUMBER got BINARY

java - 我如何告诉 Jackson ObjectMapper 使用实际属性而不是驼峰式大小写?

Spring 安全注释不适用于服务层

java - Spring REST 调用响应类型对象有微小差异

java - 如果超时间隔到期,Awaitility.await().atMost(...) 会导致程序退出?

java - lastIndexOf() 查找最后一个字母数字字符

java - 从 jar 文件夹中打开 pdf 文件时出错

java - 如何定义复合主键?

java - JPA 延迟加载在 Spring 引导中不起作用