Hibernate 正在为以下具有单表继承和使用 @IdClass 的复合主键的实体模型生成错误的插入语句 - 错误的列绑定。
想知道这是否是一个 Hibernate 错误。
堆栈:Spring Boot 2.7 / H2
超类基础实体 - AbstractMemberEvent:
@Entity
@Table(name = "MEMBER_EVENTS")
@Getter
@FieldDefaults(level = AccessLevel.PRIVATE)
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "EVENT_TYPE")
@NoArgsConstructor
@IdClass(MemberEventId.class)
public abstract class AbstractMemberEvent {
@Id
@Column(name = "USID")
String usid;
@Id
@Column(name = "UPDATED")
Long eventTime;
@Id
@Column(name = "EVENT_TYPE", insertable = false, updatable = false )
String eventType;
子类实体 - NewMemberJoined
@Entity
@Getter
@Setter
@FieldDefaults(level = AccessLevel.PRIVATE)
@DiscriminatorValue("NEWMEMBERJOINED")
@NoArgsConstructor
public class NewMemberJoined extends AbstractMemberEvent{
@Column(name="PAYLOAD")
NewMemberJoinedInfo newMemberJoinedInfo;
IdClass
@Getter
@FieldDefaults(level = AccessLevel.PRIVATE)
@NoArgsConstructor
@EqualsAndHashCode
public class MemberEventId implements Serializable {
String usid;
Long eventTime;
String eventType;
}
从日志中我看到参数绑定了错误的值
Hibernate:
create table member_events (
event_type varchar(31) not null,
updated bigint not null,
usid varchar(255) not null,
payload varchar(255),
primary key (updated, event_type, usid)
)
...
Hibernate:
insert
into
member_events
(payload, event_type, updated, usid)
values
(?, ?, ?, ?)
2022-11-25 21:52:13.789 DEBUG 527088 --- [ restartedMain] tributeConverterSqlTypeDescriptorAdapter : Converted value on binding : ...
2022-11-25 21:52:13.790 TRACE 527088 --- [ restartedMain] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - [{"firstName":"Jasper" ...}]
2022-11-25 21:52:13.790 TRACE 527088 --- [ restartedMain] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [BIGINT] - [1388534400000]
2022-11-25 21:52:13.790 TRACE 527088 --- [ restartedMain] o.h.type.descriptor.sql.BasicBinder : binding parameter [3] as [VARCHAR] - [NEWMEMBERJOINED]
2022-11-25 21:52:13.790 TRACE 527088 --- [ restartedMain] o.h.type.descriptor.sql.BasicBinder : binding parameter [4] as [VARCHAR] - [3060001234567]
2022-11-25 21:52:13.794 WARN 527088 --- [ restartedMain] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 22018, SQLState: 22018
2022-11-25 21:52:13.794 ERROR 527088 --- [ restartedMain] o.h.engine.jdbc.spi.SqlExceptionHelper : Data conversion error converting "'NEWMEMBERJOINED' (MEMBER_EVENTS: ""UPDATED"" BIGINT NOT NULL)"; SQL statement:
insert into member_events (payload, event_type, updated, usid) values (?, ?, ?, ?) [22018-214]7'
出现此问题的原因可能是未使用方言或版本错误。检查驱动程序并使用正确的驱动程序更新它们。
我遇到了同样的问题,发现我没有使用 MSSQL 服务器的方言、隐式策略和物理策略。