Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当给定id已经存在时,Spring数据JPA保存方法不会更新数据库实体_Java_Spring_Hibernate_Jpa - Fatal编程技术网

Java 当给定id已经存在时,Spring数据JPA保存方法不会更新数据库实体

Java 当给定id已经存在时,Spring数据JPA保存方法不会更新数据库实体,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,出于某种原因,我的JPA存储库不会更新现有的数据库实体,而是创建一个新的数据库实体,即使参数对象的id已经存在于数据库中 以下是我的配置: <jpa:repositories base-package="com.someName.repository.support" transaction-manager-ref="transactionManager_Support" entity-manager-factory-

出于某种原因,我的JPA存储库不会更新现有的数据库实体,而是创建一个新的数据库实体,即使参数对象的id已经存在于数据库中

以下是我的配置:

<jpa:repositories base-package="com.someName.repository.support"
                  transaction-manager-ref="transactionManager_Support"
                  entity-manager-factory-ref="entityManagerFactory_Support"/>

<bean id="transactionManager_Support" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory_Support"/>
    <property name="nestedTransactionAllowed" value="true"/>
</bean>

<bean id="entityManagerFactory_Support" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSourceSupport"/>
    <property name="persistenceXmlLocation" value="classpath:persistence.xml"/>
    <property name="persistenceUnitName" value="persistenceUnit_SUPPORT"/>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.enable_lazy_load_no_trans">true</prop>
        </props>
    </property>
</bean>

<persistence-unit name="persistenceUnit_SUPPORT" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
 <!-- List of all entity classes here -->
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
        <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.DefaultNamingStrategy" />
        <property name="hibernate.connection.charSet" value="UTF-8" />    
    </properties>
</persistence-unit>
此方法被多次调用。第一次testingResult的id为空,因此会按预期使用新id保存它。之后,将再次保存具有一些新属性集的同一对象,因为我需要更新数据库中的现有实体。而是在DB中创建一个id增加1的新记录。
有人能澄清为什么会发生这种行为吗?

你有@Version栏吗?没有。但我想我已经发现了问题所在。TestingResult类具有另一个实体作为属性。当我第一次保存它时,这个属性是空的。然后,我保存了相同的对象,但设置了子实体,并在db中创建了一条新记录。但当我再次尝试用同一个子实体保存它时,它运行良好并更新了记录。显然,关系会影响对象标识的处理方式。@RossiRobinsion如果有版本列会发生什么?你有@Version列吗?不,我没有。但我想我已经发现了问题所在。TestingResult类具有另一个实体作为属性。当我第一次保存它时,这个属性是空的。然后,我保存了相同的对象,但设置了子实体,并在db中创建了一条新记录。但当我再次尝试用同一个子实体保存它时,它运行良好并更新了记录。显然,关系会影响对象标识的处理方式。@RossiRobinsion如果存在版本列,会发生什么?
@Transactional("transactionManager_Support")
public TestingResult save(TestingResult testingResult) {

    try {
        testingResult = testingResultRepository.saveAndFlush(testingResult);
        LOGGER.info(String.format("Testing Result with id [%d] was successfully persisted", testingResult.getId()));
    } catch (Exception e) {
        LOGGER.error("Error persisting Testing Result");
    }

    return testingResult;
}