如何从 hibernate auto ddl 中排除架构

app*_*app 1 java postgresql hibernate spring-data-jpa spring-boot

我正在开发需要与 PostgresSql 数据库连接的 Spring Boot 应用程序,以从架构TaskReads中的TaskOne表读取一些记录,并将一些数据写入架构TaskWrites中的TaskTwo表,因此我已启用创建功能,如果不存在,它是在职的。hibernate.auto.ddlschemastables

问题

现在的问题是我的,因为我的应用程序只是从TaskReads架构中的TaskOne表读取数据,即使架构和表不存在,我也不想执行任何 ddl 命令。

由于我的应用程序正在将记录插入到TaskWrites架构中的TaskTwo表中,因此我负责创建架构和表(如果不存在)。

仅读取数据的TaskTwo实体

@Entity
@Table(name = "TaskOne", schema = "TaskReads")
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Subselect(value = "")
@Immutable
public class TaskOneEntity {

@Column(name = "task_id")
@Id
private Long taskId;

 }
Run Code Online (Sandbox Code Playgroud)

TaskTwo实体将数据写入表中

@Entity
@Table(name = "TaskTwo", schema = "TaskWrites")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Accessors(chain = true)
public class TaskTwoEntity {


@Column(name = "task_id")
@Id
private long taskId;

 }
Run Code Online (Sandbox Code Playgroud)

因此,通过使用@Subselect注释,即使表不存在,我也不会创建表,但如果数据库中不存在模式,它仍然会创建模式。

如何在 auto ddl 中实现排除模式?

Dea*_*ool 5

您无法直接实现这一点,因为hibernate.auto.ddl启用了整个数据库级别而不是schema级别

@Subselect(value = "")使实体只读并避免创建表。

@Table(name = "TaskOne")在表注释中删除该schema部分,以便它将检查默认模式(在 postgresql 中是公共的),并且如果表和模式不存在,则不会执行任何操作