gpt4 book ai didi

java - Hibernate 实体更新现有行而不是使用 saveAndFlush 创建新行

转载 作者:行者123 更新时间:2023-11-30 02:48:29 25 4
gpt4 key购买 nike

我在 Spring Rest 应用程序中使用 Spring data JPA、hibernate、sqlserver。

i) 对于第一个请求,一条记录被插入到数据库中。直到这里工作正常。

ii)当我用新数据发出另一个新请求时更新现有记录而不是将新记录插入数据库

iii)但是当应用程序上下文重新加载时,我可以插入新记录。

下面是代码片段。

1) hibernate 配置

public class HibernateConfiguration {

@Autowired
private Environment env;

@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();

dataSource.setDriverClassName(env.getRequiredProperty
("db.driverClassName"));
dataSource.setUrl(env.getRequiredProperty("db.url"));
dataSource.setUsername(env.getRequiredProperty("db.username"));
dataSource.setPassword(env.getRequiredProperty("db.password"));

return dataSource;
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource);
entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
entityManagerFactoryBean.setPackagesToScan(new String[] { my.domains.package });

entityManagerFactoryBean.setJpaProperties(hibProperties());

return entityManagerFactoryBean;
}

private Properties hibProperties() {
Properties properties = new Properties();
properties.put("hibernate.dialect", env.getRequiredProperty("hibernate.dialect"));
properties.put("hibernate.show_sql", env.getRequiredProperty("hibernate.show_sql"));
properties.put("hibernate.hbm2ddl.auto", env.getRequiredProperty("hibernate.hbm2ddl.auto"));
return properties;
}

@Bean
public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory);
return transactionManager;
}

2)域名

@Entity
@Table(name="Emp_Detetail")
public class EmpDetail implements java.io.Serializable {

private static final long serialVersionUID = 7342724430491939936L;

@Column(name="EmployeeId")
@Id
@GeneratedValue
private int employeeId;

.......
}

3)JPA 存储库

public interface EmpDetailRepository extends JpaRepository<EmpDetail, Integer>  {    

}

4)DAO

@Repository("empDetailDao")
public class EmpDetailDaoImpl implements EmpDetailDao {

@Resource
private EmpDetailRepository empDetailRepository;

@Override
@Transactional
public EmpDetail insertEmpDetails(EmpDetail empDetail) {
return empDetailRepository.saveAndFlush(archive);
}
}

5) 服务等级

@Service
public class EmpDetailServiceImpl implements EmpDetailService{

@Autowired
private EmpDetailDao empDetailDao;

@Autowired
private EmpDetail empBO;

private EmpDetail toInsertEmpDetails(int active, String empName) throws
Exception {
empBO.setName(empName);
empBO.setActive(active);
empBO = empDetailDao.insertEmpDetails(empBO);
}
return empBO;
}

6) Controller 代码为

 @RestController
public class EmpDeatilController {

@Resource
private EmpDetailService empDetailService;

@RequestMapping(value = "/insertEmpDetail", method =
RequestMethod.GET)
@ResponseBody
public EmpDetialResponse insertEmpDetail(@RequestParam("empName") String
empName, @RequestParam("active") int active) throws Exception{

return empDetailService.toInsertEmpDetails(active, empName);
}

}

请帮助我。

提前致谢

最佳答案

插入第一个条目时,会将插入的对象保存在字段中

@Autowired
private EmpDetail empBO;

EmpDetailServiceImpl bean 中。由于这是一个单例 bean,当您进一步调用方法 toInsertEmpDetails 时,它将使用保存的对象,更新其名称和 Activity 标志并保留它。由于该对象已经有一个 id(来自您的第一次调用),因此它将更新数据库中的条目而不是创建新条目。要解决这个问题,只需删除字段empBO即可,服务中通常不需要有这样的字段(应该是无状态的)。

关于java - Hibernate 实体更新现有行而不是使用 saveAndFlush 创建新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39430757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com