Hibernate:从PostgreSQL视图中获取实体



让我们假设数据库中有两个实体。我们有一个具有唯一Id:的简单服务器

PostgreSQL:

CREATE TABLE public.servers (
id bigint NOT NULL,
name character varying(64) NOT NULL
);
ALTER TABLE ONLY public.servers
ADD CONSTRAINT servers_pkey PRIMARY KEY (id);

类别实体:

@Entity
@Table(name = "servers")
public class Server {
@Id
private long id;
private String name;
@OneToMany(mappedBy = "server", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private List<Channel> channels;
public Server() {}
public Server(String name) {
this.name = name;
channels = new ArrayList<>();
}
// Getters and Setters...
}

每个服务器可以有几个信道,这些信道也有一个唯一的id,属于一个服务器:

PostgreSQL:

CREATE TABLE public.channels (
id bigint NOT NULL,
server_id bigint NOT NULL,
name character varying NOT NULL
);
ALTER TABLE ONLY public.channels
ADD CONSTRAINT channels_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.channels
ADD CONSTRAINT fkey_channel_server FOREIGN KEY (server_id) REFERENCES public.servers(id);

类别实体:

@Entity
@Table (name = "channels")
public class Channel {
@Id
private long id;
private String name;
@ManyToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "server_sn")
private Server server;
public Channel() {}
public Channel(Server server, String name) {
this.server = server;
this.name = name;
}
// Getters and Setters...
}

接下来,我在PostgreSQL中创建一个视图:

CREATE VIEW public.summary AS
SELECT servers.s_snowflake AS server_id, channels.c_snowflake AS channel_id, channels.name FROM servers
JOIN channels ON servers.s_snowflake = channels.server_sn;

我想从这个视图中获取数据,但我面临着如何实现类的问题。我试过这样的东西:

@Embeddable
class SummaryPK implements Serializable {
private long server_id;
private long channel_id;
}
@Entity
@Immutable
@Subselect("SELECT * FROM summary")
public class Summary  {
@EmbeddedId
private SummaryPK summaryPK;
@MapsId("server_id")
@ManyToOne(fetch = FetchType.LAZY, targetEntity = Server.class)
@JoinColumn(name = "id", insertable = false, updatable = false)
private Server server;
@MapsId("channel_id")
@ManyToOne(fetch = FetchType.LAZY, targetEntity = Channel.class)
@JoinColumn(name = "id", insertable = false, updatable = false)
private Channel channel;
private String name;
// Getters and Setters
}

在程序中,我想通过传递服务器ID来接收实体列表。知道如何在这里实现工作结构吗?

修复了JoinColumn:中存在错误id的问题

@JoinColumn(name = "server_id", insertable = false, updatable = false)
@JoinColumn(name = "channel_id", insertable = false, updatable = false)

最新更新