gpt4 book ai didi

java - Spring JPA/Hibernate 未更新到数据库以在保存时更改 @Entity 的 boolean 值

转载 作者:太空宇宙 更新时间:2023-11-04 12:20:15 24 4
gpt4 key购买 nike

在某些时候,我的应用程序在由我的存储库保存时停止保存@Entityboolean值。

进行了 REST 调用,在该调用中,我将 Device 设置为 InUse 为 true。

        device.setInUse(inUse);
Device savedDev = deviceRepository.save(device);

Logger.debug("Device after save isInUse() " + savedDev.isInUse());
Thread.sleep(5000);

Device dbDev2 = deviceRepository.findOne(device.getSerial());
Logger.debug("Device again from db for isInUse() " + dbDev2.isInUse());

对于正在保存的设备和发出 deviceRepository.findOne(device.getSerial()) 时,此输出均为 true。问题是当我进入数据库并实际查看记录时它没有被更新。

我打开了 hibernate 调试日志记录,但看不到对设备进行的更新。当我保存其他 @Entity 时,我可以在日志中看到 hibernate 查询。这让我相信它以某种方式缓存了这个。

在我看到的 hibernate 日志中

  • 包含从 hibernate 加载的设备列表的父对象
  • (这是设备应使用 inUse = true 进行更新的位置)
  • 继续从 Hibernate 加载来自父级的 @Entity 列表的其他详细信息,但从不更新设备...

问题

我想知道是什么原因造成的?

休息 Controller

@RestController
@Transactional(propagation = Propagation.REQUIRED)
public class HomeController {

@Autowired
private DeviceRepository deviceRepository;

/**
* Default index
*
* @return
*/
@RequestMapping(value = "/")
public String index() {
return "index";
}


@RequestMapping(value = "runTestRun", method = RequestMethod.POST)
public ResponseEntity<String> runTestRun(@RequestBody String jsonObject) throws Exception {

.....
setDevicesInUse(testRun.getDevices(), true);
.....
}

private void setDevicesInUse(Set<Device> devices, boolean inUse) throws InterruptedException {
for (Device device : devices) {
Logger.debug("Marking Device " + device.getSerial() + " " + device.getReadableName() + " InUse to " + inUse);

Device dbDev = deviceRepository.findOne(device.getSerial());
Logger.debug("Device before change checking isInUse() " + dbDev.isInUse());
dbDev.setInUse(inUse);
Logger.debug("Device after setting isInUse() " + dbDev.isInUse());

device.setInUse(inUse);
Device savedDev = deviceRepository.save(device);

Logger.debug("Device after save isInUse() " + savedDev.isInUse());
Thread.sleep(2000);

Device dbDev2 = deviceRepository.findOne(device.getSerial());
Logger.debug("Device again from db for isInUse() " + dbDev2.isInUse());
Thread.sleep(2000);
}
}

应用程序属性

# DataSource settings: set here your own configurations for the database
# connection.
spring.datasource.url: jdbc:mysql://localhost/xxx
spring.datasource.username=xxx
spring.datasource.password=xxx
spring.datasource.driverClassName=com.mysql.jdbc.Driver

# Keep the connection alive if idle for a long time (needed in production)
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1

# Show or not log for each sql query
spring.jpa.show-sql = true

# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update

# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy

# Use spring.jpa.properties.* for Hibernate native properties (the prefix is
# stripped before adding them to the entity manager)

# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

# Use hibernates new generator mappings, this is used for the appium port using a TABLE generator
spring.jpa.properties.hibernate.id.new_generator_mappings=true

# Web server
spring.data.rest.base-path=/api
server.context-path=/api
server.port=8082

# TODO FOR DEBUG ONLY
spring.thymeleaf.cache=false
spring.freemarker.cache=false
spring.groovy.template.cache=false
spring.velocity.cache=false
spring.mustache.cache=false
server.session.persistent=true
spring.h2.console.enabled=true
spring.resources.cache-period=0

我尝试添加以下内容,但没有什么区别

spring.jpa.properties.hibernate.cache.use_second_level_cache=falsespring.jpa.properties.hibernate.cache.use_query_cache=false

设备

@Data
@Entity
@Table(name = "device")
public class Device {


private @Id String serial;
private boolean active;
private boolean inUse;

private @Version @JsonIgnore Long version;

private Device() {
}

最佳答案

问题与 Transnational 的设置有关,因为它尚未完成事务,因此发送到数据库。

@Transactional(propagation = Propagation.REQUIRED)

关于java - Spring JPA/Hibernate 未更新到数据库以在保存时更改 @Entity 的 boolean 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38923833/

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