Java 当给定id已经存在时,Spring数据JPA保存方法不会更新数据库实体
出于某种原因,我的JPA存储库不会更新现有的数据库实体,而是创建一个新的数据库实体,即使参数对象的id已经存在于数据库中 以下是我的配置: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: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;
}