Java 多对一(项目类型关系):标识符从x更改为y

Java 多对一(项目类型关系):标识符从x更改为y,java,hibernate,spring-mvc,Java,Hibernate,Spring Mvc,我有两个类项目和类型。项目属于一种类型 它工作正常。但是,当我尝试更改已保存项目的类型时,会出现以下错误: com.myapp.model.Type实例的标识符已从1更改为1 到2 Hibernate似乎认为我试图编辑类型的id。实际上,我想更改项目的类型,而不是编辑它所在的类型。举个简单的例子,我有一个项目名称“Ball”属于“sport”类型,但现在我想将其更改为“Tool”类型。Hibernate认为我想把“Sport”类型的名称(和Id)改成“Tool” 伪代码: Item item =

我有两个类项目和类型。项目属于一种类型

它工作正常。但是,当我尝试更改已保存项目的类型时,会出现以下错误:

com.myapp.model.Type实例的标识符已从1更改为1 到2

Hibernate似乎认为我试图编辑类型的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>

我认为正确的方法是

Item item = getItemFromDatabase(itemId);
item.setType(getItemTypeFromDatabase(newTypeId));
saveItem(item);

我认为正确的方法是

Item item = getItemFromDatabase(itemId);
item.setType(getItemTypeFromDatabase(newTypeId));
saveItem(item);

那么您得到了一个id为newTypeId的ItemType实例,但它仍然抛出相同的错误?您可以发布getItemTypeFromDatabase(itemTypeId)的代码吗?检查您是否实际设置了itemTypeId的不同实例谢谢,我发现了问题。问题不在于Hibernate,而在于Spring绑定方法。我将“item.type.id”绑定到一个文本框,这是错误的,因为hibernate会认为我正在尝试更改该类型的id。所以您得到了一个id为newTypeId的ItemType实例,但它仍然抛出相同的错误?您可以发布getItemTypeFromDatabase(itemTypeId)的代码吗?检查您是否实际设置了itemTypeId的不同实例谢谢,我发现了问题。问题不在于Hibernate,而在于Spring绑定方法。我将“item.type.id”绑定到一个文本框,这是错误的,因为hibernate会认为我正在尝试更改该类型的id。
Type updatedType = repository.getById(Type.class, item.getType().getId());
Item item = getItemFromDatabase(itemId);
item.setType(getItemTypeFromDatabase(newTypeId));
saveItem(item);