JPA/Hibernate:在不存在的序列/关系上选择currval



我对 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,现在它似乎可以工作了。

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

最新更新