gpt4 book ai didi

java - 使用 Hibernate 在 Postgres 中使用 @EmbeddedId 和 @ElementCollection 持久化实体时出现问题

转载 作者:行者123 更新时间:2023-12-02 03:28:28 25 4
gpt4 key购买 nike

我想使用 Hibernate 在 Postgres 9 上执行 CRUD 操作。

实体:

@Entity
@Table(name = "MESSAGE_HISTORY_RECORD")

public class MessageHistoryRecord {

@EmbeddedId
private MessageCompoundKey compoundKey;

@Column
private String responseChannel;

@ElementCollection
private List<Trace> traces;

@Column
private byte[] payload;

//getters and setters
}

复合 ID 实体:

@Embeddable
public class MessageCompoundKey implements Serializable {

private static final long serialVersionUID = 9084329307727034214L;

@Column
private String correlatedMsgId;

@Column
private String messageId;

@Column
private String endpointId;

//getters and setters
}

元素集合实体:

@Embeddable
public class Trace implements Serializable{

private static final long serialVersionUID = 9084329307727034214L;

private Long timestamp;

private String description;

//getters and setters
}

我正在使用 hibernate.hbm2ddl.auto=update 为我创建架构。

它为我创建了表格:

CREATE TABLE "public"."message_history_record"
(
correlatedmsgid varchar(255) NOT NULL,
endpointid varchar(255) NOT NULL,
messageid varchar(255) NOT NULL,
payload bytea,
responsechannel varchar(255),
CONSTRAINT message_history_record_pkey PRIMARY KEY (correlatedmsgid,endpointid,messageid)
)
;
CREATE UNIQUE INDEX message_history_record_pkey ON "public"."message_history_record"
(
correlatedmsgid,
endpointid,
messageid
)
;

CREATE TABLE "public"."messagehistoryrecord_traces"
(
messagehistoryrecord_correlatedmsgid varchar(255) NOT NULL,
messagehistoryrecord_endpointid varchar(255) NOT NULL,
messagehistoryrecord_messageid varchar(255) NOT NULL,
description varchar(255),
timestamp bigint
)

在保留任何对象时,我在 messagehistoryrecord_traces 表中没有找到任何条目。

hibernate 属性:

hibernate.connection.driver_class=org.postgresql.Driver
hibernate.connection.url=jdbc:postgresql://192.xx.xx.xx:5432/testdb
hibernate.connection.username=***
hibernate.connection.password=****
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
hibernate.connection.pool_size=10
hibernate.show_sql=true
hibernate.hbm2ddl.auto=update

保留sql:

Hibernate: insert into MESSAGE_HISTORY_RECORD (payload, responseChannel, correlatedMsgId, endpointId, messageId) values (?, ?, ?, ?, ?)

最佳答案

根据您的配置,默认值应应用于集合表的表名称、列名称和连接列名称。这些默认值的构造如下:

  1. 表名称:引用实体的名称,附加下划线以及包含元素集合的实体属性的名称 (MessageHistoryRecord_traces)

  2. 连接列:引用实体的名称,附加带有下划线和实体表主键列的名称。

仅当您的父实体中有一个主键字段(但您的情况并非如此)时,才允许使用第二种情况。因此,您自己指定了联接列,如下所示(我重命名了集合表名称和外键列名称,因为它们对于我的数据库系统来说太长了):

@ElementCollection
@CollectionTable(name = "mhr_traces",
joinColumns={@JoinColumn(name="mhr_correlatedmsgid", referencedColumnName="correlatedmsgid"),
@JoinColumn(name="mhr_endpointid", referencedColumnName="endpointid"),
@JoinColumn(name = "mhr_messageid", referencedColumnName = "messageid")})
private List<Trace> traces = new ArrayList<>();

还有一件事:如果您还没有实现的话,您必须为主键类实现 equals() 和 hashCode() 方法(它们是在您的帖子中不可见)。

您的表创建脚本还缺少外键定义(如果未自动生成,请手动添加):

CONSTRAINT mrFK FOREIGN KEY (mhr_correlatedmsgid, mhr_endpointid, mhr_messageid) REFERENCES MESSAGE_HISTORY_RECORD (correlatedmsgid,endpointid,messageid)

调整它以匹配您的数据库语法(我不知道 PostgreSQL)

通过这些调整,一切都对我有用;实际上是在 Oracle 数据库系统和 EclipseLink 作为持久性提供者上。我认为这不是特定于实现的

关于java - 使用 Hibernate 在 Postgres 中使用 @EmbeddedId 和 @ElementCollection 持久化实体时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38435505/

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