gpt4 book ai didi

hibernate - JPA/hibernate : select currval on non existing sequence/relation

转载 作者:行者123 更新时间:2023-12-02 16:00:33 24 4
gpt4 key购买 nike

我在使用 JPA/Hibernate 时遇到了一个令人困惑的问题:将值插入表后,对不存在的关系/序列执行 select currval() 。我有两个类似的案例,一个有效,另一个无效。

这是第一个非工作版本。

实体:

@Entity
@Table(name = "meter")
@Data
@EqualsAndHashCode(callSuper = true)
public class Meter extends AbstractTimestampEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "meter_id")
private Long meterId;

@Column(name = "meter_id_str")
private String meterIdStr;

@Column(name = "contract_id")
private Long contractId;

@Column(name = "user_id")
private Long userId;

@Column(name = "com_id")
private String comId;

@Column(name = "is_active")
private Boolean isActive;
}

飞路脚本:

CREATE SEQUENCE meter_seq;
CREATE TABLE IF NOT EXISTS meter (
id BIGINT NOT NULL DEFAULT nextval('meter_seq'),
meter_id BIGINT,
meter_id_str VARCHAR(20),
contract_id BIGINT,
user_id BIGINT,
com_id VARCHAR(50),
is_active BOOLEAN,
created_at BIGINT,
modified_at BIGINT,
CONSTRAINT pk_meter PRIMARY KEY (id)
);
ALTER SEQUENCE meter_seq OWNED BY meter.id;

服务:

@Override
@Transactional
public void updateUser(UserDTO userDTO, ContractDTO contractDTO, MeterDTO meterDTO) {
String meterIdStr = meterDTO.getMeterId();
long uid = userDTO.getId();
long cid = contractDTO.getId();
long mid = meterDTO.getId();
boolean isActive = meterDTO.isActive();

log.debug("Updating meter state: {}, isActive: {}, contractId: {}, userId: {}", mid, isActive, cid, uid);

Meter meter = this.meterRepository.find(uid, cid, meterIdStr);
if (meter == null) {
log.debug("No meter found, creating new meter.");
meter = new Meter();
meter.setMeterId(mid);
meter.setMeterIdStr(meterIdStr);
meter.setContractId(cid);
meter.setUserId(uid);
meter.setIsActive(true);
this.meterRepository.save(meter);
} else {
if (isActive != meter.getIsActive()) {
meter.setIsActive(isActive);
this.meterRepository.save(meter);
this.cacheService.evict(CacheNames.METER,
new SimpleKey(meter.getMeterIdStr(), meter.getComId()).toString());

// remove meter from monitoring if it is not active any longer
if (!isActive) {
String key = String.format("%d-%d-%d", uid, cid, mid);
this.boundHashOperations.delete(key);
}
}
}

log.debug("Done");
}

插入新的 Meter 时总是出现错误(在服务类中的 this.meterRepository.save() 行中):

2018-05-23 06:42:21.303 TRACE - [-enerContainer-4]            o.h.e.j.i.JdbcCoordinatorImpl : Starting after statement execution processing [ON_CLOSE]
2018-05-23 06:42:21.303 DEBUG - [-enerContainer-4] o.hibernate.SQL : select currval('meter_data_receiver.meter_id_seq')
2018-05-23 06:42:21.303 TRACE - [-enerContainer-4] o.h.r.j.i.ResourceRegistryStandardImpl : Registering statement [HikariProxyPreparedStatement@75642772 wrapping select currval('meter_data_receiver.meter_id_seq')]
2018-05-23 06:42:21.304 ERROR - [-enerContainer-4] o.h.e.j.s.SqlExceptionHelper : FEHLER: Relation „meter_data_receiver.meter_id_seq“ existiert nicht

排名:16

没有序列/关系“meter_data_receiver.meter_id_seq”。

另一种情况类似,但在这里我可以在日志中看到以下消息:

2018-05-23 06:42:21.345 DEBUG - [RedisMessageLis]          o.h.i.IdentifierGeneratorHelper : Natively generated identity: 2

因此,在这种情况下,ID 似乎是在插入操作后从数据库中获取的,而在第一种情况下,对不存在的序列/关系执行了额外的 select

我不知道为什么 Hibernate 认为它可以通过查询序列来获取第一个案例的 ID...

最佳答案

好的,我已从配置中删除了选项 properties.hibernate.temp.use_jdbc_metadata_defaults: false,现在它似乎可以工作。

我不确定为什么我首先添加此选项,我认为有一个警告建议我应该添加它......

关于hibernate - JPA/hibernate : select currval on non existing sequence/relation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50480622/

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